2016-06-11 60 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 ith更大的陣列)?

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