2016-06-11 2 views
2

私はpython numpyにはかなり新しいです。numpyを使って複数のndarryを追加する

もし私がnumpyベクトルのリストを持っていれば。計算が高速であることを保証する最良の方法は何ですか。

現在、私はそれが遅すぎると感じています。

vec = sum(list of numpy vectors) # 4 vectors of 500 dimensions each 

合計でかなりの時間がかかります。

+0

問題の説明はあいまいです。 – hpaulj

答えて

1

私の意見では、これは既に最も速い変形です。それは純粋な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

2

これはあなたがやろうとしていることですが(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 
関連する問題