私はpython numpyにはかなり新しいです。numpyを使って複数のndarryを追加する
もし私がnumpyベクトルのリストを持っていれば。計算が高速であることを保証する最良の方法は何ですか。
現在、私はそれが遅すぎると感じています。
vec = sum(list of numpy vectors) # 4 vectors of 500 dimensions each
合計でかなりの時間がかかります。
私はpython numpyにはかなり新しいです。numpyを使って複数のndarryを追加する
もし私がnumpyベクトルのリストを持っていれば。計算が高速であることを保証する最良の方法は何ですか。
現在、私はそれが遅すぎると感じています。
vec = sum(list of numpy vectors) # 4 vectors of 500 dimensions each
合計でかなりの時間がかかります。
私の意見では、これは既に最も速い変形です。それは純粋なnumpy
であり、そのようにC
-codeで計算されます。
代わりに、各ベクトルの合計を個別に計算し、リストの値を合計したり、すべてのベクトルを積み重ねて合計したりすることもできます。しかし、両方が遅いです:
import numpy as np
import time
n = 10000
start = time.time()
for i in range(n):
lst = np.hstack([np.random.random(500) for i in range(4)])
x = np.sum(lst)
print("stack then np.sum: ", time.time()- start)
start = time.time()
for i in range(n):
lst = [np.sum(np.random.random(500)) for i in range(4)]
x = np.sum(lst)
print("sum up individually: ", time.time()- start)
start = time.time()
for i in range(n):
lst = [np.random.random(500) for i in range(4)]
x = np.sum(lst)
print("np.sum on list of vectors:", time.time()- start)
出力:その後、
スタックnp.sum:個別0.35804247856140137
合計アップ:ベクトルのリストに0.400468111038208
np.sum:0.3427283763885498
これはあなたがやろうとしていることですが(w大規模な配列)
In [193]: sum([np.ones((2,3)),np.arange(6).reshape(2,3)])
Out[193]:
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
500 dimensions each
は不明です。形状が(500,)
、またはndim==500
の配列を意味しますか?後者の場合、要素の合計数はわずかです。
これらの配列のうち4つのリストであるという事実は大きな問題ではないはずです。 array1 + array2
は何時ですか?
アレイはちょうど500個の要素それぞれを持っている場合、合計時間は自明である。
In [195]: timeit sum([np.arange(500),np.arange(500),np.arange(500),np.arange(500)])
10000 loops, best of 3: 20.9 µs per loop
そのようなアレイは
はるかに大きいので、一方多くの小さな寸法のアレイの合計が単に遅いですIn [204]: x=np.ones((3,)*10)
In [205]: timeit z=sum([x,x,x,x])
1000 loops, best of 3: 1.6 ms per loop
問題の説明はあいまいです。 – hpaulj