2016-07-23 6 views
0

Ich frage mich, ob Sie eine Funktion definieren können, um gleichzeitig auf alle Elemente eines 1-d-Numpy-Arrays zu wirken, so dass Sie das Array nicht durchlaufen müssen. Ähnlich wie Sie beispielsweise alle Elemente eines Arrays ohne Loopen quadrieren können. Ein Beispiel dessen, was ich bin, ist nach diesen Code zu ersetzen:Funktion, die auf alle Elemente von numpy Array wirkt?

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 
B = [] 

for i in A: 
    B.append(i[0] + i[1] - i[2]) 

B = array(B) 
print B 

Ausgang:

>>> array([3, -2, 6, 3]) 

Mit so etwas wie:

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 

def F(Z): 
    return Z[0] + Z[1] - Z[2] 

print F(A) 

Damit der Ausgang ist so etwas wie:

>>> array([ [3] , [-2], [6], [3] ]) 

Ich kenne den 2. Code w Ich produziere nicht, wonach ich suche, aber ich versuche nur eine Vorstellung davon zu vermitteln, wovon ich spreche. Vielen Dank!

EDIT:

habe ich die Funktion oben nur als ein einfaches Beispiel. Die eigentliche Funktion Ich mag würde zu verwenden ist so etwas wie diese:

from numpy import linalg as LA 

def F(Z): 
    #Z is an array of matrices 
    return LA.eigh(Z)[0] 

ich ein Array von 3x3 Matrizen So habe, und ich würde eine Ausgang Array ihres Eigenwerts mag. Und ich frage mich, ob es möglich ist, dies auf irgendeine numptonische Weise zu tun, um nicht über das Array zu schleifen.

+0

Slicing helfen könnten: http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing – Divakar

+3

'B = A [:, 0] + A [:, 1] - A [:, 2] '? (Angenommen, Sie meinten "i [2]' anstatt '[2]'.) Oder Sie könnten 'np.dot' verwenden: Sie machen hier im Wesentlichen eine Matrix-für-Vektor-Multiplikation. –

+1

'numpy' hat bereits einen grundlegenden Satz von Funktionen definiert, die auf allen Elementen eines oder mehrerer Arrays funktionieren. Effizienter 'nummery' Code kombiniert diese Funktionen. Betrachten Sie es als eine Reihe von "parallelen" Bausteinen. Versuchen Sie, diese zu verwenden, bevor Sie auf das "serielle" Denken zurückgreifen (indem Sie eine Skalarfunktion durchlaufen). – hpaulj

Antwort

3

Versuchen:

np.apply_along_axis(F, 1, A) 
+2

In diesem speziellen Fall ist dies jedoch unnötig ineffizient, da es eine "for" -Schleife auf Python-Ebene gibt, die an der Implementierung von "apply_along_axis" beteiligt ist. (Nun, eigentlich ist es eine "while" -Schleife, aber es kommt zur selben Sache.) Eine einfache Slicing-Lösung könnte besser sein. –

+0

Ja, das stimmt. Ich habe gerade einige Tests durchgeführt und diese Lösung funktioniert nicht schneller als eine for-Schleife. Es ist definitiv eine effizientere Art Code zu schreiben, aber es reduziert nicht die Recheneffizienz, was mein Ziel ist. Ich denke, Slicen kann der richtige Weg sein. Danke für die Antworten jeder. – cracka31

Verwandte Themen