2012-05-20 2 views
4

У меня есть этот массивнорма массивов векторов питона

A = array([[-0.49740509, -0.48618909, -0.49145315], 
    [-0.48959259, -0.48618909, -0.49145315], 
    [-0.49740509, -0.47837659, -0.49145315], 
    ..., 
    [ 0.03079315, -0.01194593, -0.06872366], 
    [ 0.03054901, -0.01170179, -0.06872366], 
    [ 0.03079315, -0.01170179, -0.06872366]]) 

, который представляет собой набор 3D вектора. Мне было интересно, могу ли я использовать векторную операцию для получения массива с нормой каждого из моих векторов.

Я пробовал с norm(A), но это не сработало.

+0

Является ли это массивным массивом? –

+0

да, это относится к тому, что я просил? – Brian

+3

Я думаю, что да. ['numpy.array'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html) отличается от [' array'] (http: //docs.python. org/library/array.html) в Python. Я предполагаю, что вам нужны ответы, связанные с 'numpy.array'? –

ответ

7

Делать это вручную может быть быстрым (хотя всегда есть некоторые аккуратные трюк кто-то сообщения, я не думал о):

In [75]: from numpy import random, array 

In [76]: from numpy.linalg import norm 

In [77]: 

In [77]: A = random.rand(1000,3) 

In [78]: timeit normedA_0 = array([norm(v) for v in A]) 
100 loops, best of 3: 16.5 ms per loop 

In [79]: timeit normedA_1 = array(map(norm, A)) 
100 loops, best of 3: 16.9 ms per loop 

In [80]: timeit normedA_2 = map(norm, A) 
100 loops, best of 3: 16.7 ms per loop 

In [81]: timeit normedA_4 = (A*A).sum(axis=1)**0.5 
10000 loops, best of 3: 46.2 us per loop 

Это предполагает, что все реально. Вместо этого можно умножить на сопряженное, если это неверно.

Обновление: предложение Эрика об использовании math.sqrt не будет работать - оно не обрабатывает массивы numpy - но идея использования sqrt вместо **0.5 является хорошей, поэтому давайте ее протестируем.

In [114]: timeit normedA_4 = (A*A).sum(axis=1)**0.5 
10000 loops, best of 3: 46.2 us per loop 

In [115]: from numpy import sqrt 

In [116]: timeit normedA_4 = sqrt((A*A).sum(axis=1)) 
10000 loops, best of 3: 45.8 us per loop 

Я попробовал это несколько раз, и это была самая большая разница, которую я видел.

+0

'** 0.5' всегда будет медленнее, чем' math.sqrt' – Eric

0

Как насчет this method? Также вы можете добавить тэг [numpy] в сообщение.

+0

Первоначально я думал, что вы не можете найти метод 'linalg.norm', поскольку вы сказали, что норма (A)« не работает », но после прочтения ответа Эрика я предполагаю, что более вероятно, что вы попытались« linalg.norm », но он не дал вам то, что вы хотели. – Junuxx

+0

Очень неполный ответ. –

+0

@JoelCornett: В результате того, что OP расплывчато с «это не сработало». Он мог бы объяснить, что он пытался и как это не сработало. Как я объяснил в своем комментарии выше. – Junuxx

0

Никогда не использовал NumPy, я буду гадать:

normedA = array(norm(v) for v in A) 
+0

работает, но для большого набора данных это очень медленно. – Brian

+1

'map (norm, A)' в этой ситуации может быть быстрее. –

+1

@Joel: Да, но он не возвращает массив numpy, поэтому вам, по крайней мере, пришлось бы обернуть его в 'np.array()' –

Смежные вопросы