2016-04-25 20 views
1

Ich versuche, alle Indizes aus einem (N x N x N) Numpy-Array zu extrahieren, wobei Werte in A- und B-Arrays gleich einem Wert x sind - finden Sie die gemeinsame Überlappung.Logische Indizierung in Python für nd-Arrays

Ich versuche:

A[A==1 and B==1] 

aber einen Fehler:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Wie kann ich dieses Problem umgehen?

+0

vielleicht etwas voreilig diese Frage zu veröffentlichen. Benutzte numpys logische_und (x1, x2 [, out]) – JB1

Antwort

3

Numpy kann das Schlüsselwort "and" nicht überladen. Es überlädt jedoch den binären UND-Operator & dafür. Versuchen:

A [(A == 1) & (B == 1)]

Die Klammern wichtig sind. Ich finde es oft (nicht immer) besser lesbar logical_and dann

+0

Danke! Ich fand auch, dass numpy seine eigenen logischen Funktionen hat (wie unten), aber das ist sehr nützlich zu wissen !! – JB1

0

vielleicht etwas voreilig diese Frage zu veröffentlichen. Benutzte numpy's

logical_and(x1, x2[, out]) 

am Ende, das die Arbeit perfekt gemacht hat!

1

Betrachten Sie die folgenden 3-dimensionale Arrays, die mit den Werten -1 zufällig bestückt sind, 0 und 1:

import numpy as np 
np.random.seed(2016) # use a fixed seed to get the same results on multiple runs 
N = 3 
A = np.random.randint(-1, 2, N**3).reshape([N, N, N]) 
B = np.random.randint(-1, 2, N**3).reshape([N, N, N]) 

Beachten Sie, dass Sie verwenden müssen ein fester Samen (zum Beispiel 2016), um die gleichen Ergebnisse auf mehreren Läufe zu erhalten:

>>> print A 
[[[ 1 1 0] 
    [-1 1 -1] 
    [-1 -1 -1]] 

[[ 0 1 1] 
    [-1 1 1] 
    [ 0 1 0]] 

[[ 0 1 0] 
    [-1 1 1] 
    [-1 1 0]]] 

>>> print B 
[[[-1 0 0] 
    [-1 -1 1] 
    [ 0 -1 -1]] 

[[-1 -1 -1] 
    [-1 1 1] 
    [-1 1 1]] 

[[ 1 1 -1] 
    [-1 0 1] 
    [-1 1 -1]]] 

Wenn Ihr Ziel ist es, dass die Indizes der Elemente zu extrahieren, die mit 1 in den beiden Matrizen sind, können Sie feststellen, Dieser Code wird verwendet Ful:

>>> np.transpose(np.where((A==1)*(B==1))) 
array([[1, 1, 1], 
     [1, 1, 2], 
     [1, 2, 1], 
     [2, 0, 1], 
     [2, 1, 2], 
     [2, 2, 1]], dtype=int64)