2016-06-11 8 views
2

Ich bin ziemlich neu bei Python numpy.Hinzufügen von mehreren Ndarry mit numpy

Wenn ich eine Liste von numpy Vektoren habe. Was ist der beste Weg, um eine schnelle Berechnung zu gewährleisten?

Ich mache gerade das, was ich finde es zu langsam zu sein.

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

Es braucht ziemlich viel Zeit mit der Summe.

+0

Ihre Beschreibung des Problems ist nicht eindeutig. – hpaulj

Antwort

1

Meiner Meinung nach ist dies schon die schnellste Variante. Es ist rein numpy und als solche innerhalb C-Code berechnet.

Alternativen könnten sein, die Summen jedes Vektors einzeln zu berechnen und dann die Werte der Liste zu summieren oder alle Vektoren zu stapeln und dann zusammenzufassen. Aber beide sind langsamer:

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) 

Ausgang:

Stapel dann np.sum: 0,35804247856140137

Summe up individuell: 0,400468111038208

np.sum auf Liste von Vektoren: ,3427283763885498

2

Ist das, was Sie versuchen zu tun (aber w ith viel größere Arrays)?

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 ist eine unklare Beschreibung. Meinst du ein Array mit Form (500,) oder mit ndim==500? Wenn letzteres, wie viele Elemente insgesamt gibt es.

Die Tatsache, dass es eine Liste von 4 dieser Arrays ist, sollte keine große Sache sein. Was ist die Zeit für array1 + array2?

Wenn die Arrays nur 500 Elemente haben jeweils die Summe der Zeit ist trivial:

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 

auf der anderen Seite eine Summe von Arrays mit vielen kleinen Abmessungen langsamer einfach ist, weil eine solche Anordnung viel größer ist

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 
Verwandte Themen