5

私はこの配列を持っています

   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)たが、うまくいきませんでした。

4

4 に答える 4

9

手動で行うのが最も速いかもしれません(私が思いもよらなかった誰かの投稿には常に巧妙なトリックがありますが):

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

これは、すべてが本物であることを前提としています。それが当てはまらない場合は、代わりに共役を掛けることができます。

更新:Ericの使用の提案は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

何度か試してみましたが、これが最大の違いでした。

于 2012-05-20T15:09:54.340 に答える
1

ちょうど同じ確率で、答えるのが遅いかもしれませんが、これは他の人を助けるはずです。norm関数でaxis引数を使用できます

norm(A, axis=1)
于 2020-05-13T09:35:55.607 に答える
0

この方法はどうですか?また、投稿に[numpy]タグを追加することもできます。

于 2012-05-20T14:55:32.420 に答える
0

numpyを使用したことがないので、推測します。

normedA = array(norm(v) for v in A)
于 2012-05-20T14:57:03.130 に答える