2016-06-30 3 views
0

Ich habe eine 2d numpy Array und ich brauche alle Elemente zu extrahieren array[i][j], wenn die BedingungenWie schreibe ich numpy, wo die Bedingung auf Indizes und nicht auf Werten basiert?

x1range < i < x2range und y1range < j < y2range zufrieden sind.

Wie schreibe ich solche Bedingungen? Muss ich mgrid/ogrid verwenden?

Edit: Sollte meine zusätzliche Anforderung geschrieben haben. Ich suchte nach einer where-Bedingung und nicht nach splicing, weil ich die Werte aller Elemente zu (0,0,0) ändern möchte, die die obige Bedingung erfüllen. Ich nahm an, wenn ich eine Bedingung habe, könnte ich das tun.

Edit2: Ist es auch möglich, das "nicht" der oben genannten Bedingung zu bekommen?

Wie in,

if i > x1range and i < x2range and j > y1range and j < y2range: # the above condition 
    do nothing # keep original value 
else: 
    val = (0,0,0) 

Antwort

0

Problem # 1: Erste Indizes im Bereich

Sie np.meshgrid verwenden könnten, um diese Indizes zu erhalten -

In [145]: x1range,x2range = 2,5 
    ...: y1range,y2range = 1,4 
    ...: 

In [146]: np.meshgrid(np.arange(x1range,x2range),np.arange(y1range,y2range)) 
Out[146]: 
[array([[2, 3, 4], 
     [2, 3, 4], 
     [2, 3, 4]]), array([[1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3]])] 

Problem # 2: Extrahieren o r Einstellung Eingabefeldelemente innerhalb dieser Bereiche

Sie np.ix_ nutzen könnten, um direkt Index in dem Eingangsfeld arr -

In [148]: arr 
Out[148]: 
array([[97, 69, 0, 60, 28, 97], 
     [98, 85, 24, 75, 97, 23], 
     [70, 25, 77, 86, 93, 66], 
     [ 0, 85, 51, 17, 40, 92], 
     [66, 28, 28, 22, 79, 52]]) 

In [149]: arr[np.ix_(np.arange(x1range,x2range),np.arange(y1range,y2range))] 
Out[149]: 
array([[25, 77, 86], 
     [85, 51, 17], 
     [28, 28, 22]]) 

Mit dieser Indizierung kann man auch alle diese Elemente direkt eingestellt.

Problem # 3: Extrahieren oder Eingabefeldelemente NICHT Einstellung innerhalb dieser Bereiche

die not zufrieden Elemente 0s und Ruhe als das gleiche zu halten einzustellen/zu extrahieren, Sie NumPy broadcasting alongwith boolean-indexing wie so verwenden können -

In [150]: Imask = np.in1d(np.arange(arr.shape[0]),np.arange(x1range,x2range)) 
    ...: Jmask = np.in1d(np.arange(arr.shape[1]),np.arange(y1range,y2range)) 
    ...: arr[~(Imask[:,None] & Jmask)] = 0 
    ...: 

In [151]: arr 
Out[151]: 
array([[ 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0], 
     [ 0, 25, 77, 86, 0, 0], 
     [ 0, 85, 51, 17, 0, 0], 
     [ 0, 28, 28, 22, 0, 0]]) 
+0

Hallo, ich werde das versuchen. Und nur eine zusätzliche Frage, was ist, wenn ich diese Abfrage umkehren möchte? Ist das möglich? Wie in, das 'nicht' dieser Bedingung? – n00b

+0

@ n00b Können Sie die Frage mit einem Beispiel bearbeiten, was Sie mit "nicht" dieser Bedingung meinen? – Divakar

+0

HALLO, habe ich die nicht Bedingung bearbeitet und erweitert. – n00b

0

nur eine Vermutung.

x=array[x1range:x2range,y1range:y2range] 
+0

Warum funktioniert dieser Code? Könntest du bitte einen Kontext hinzufügen deine Antwort? – ppperry

0

Wie wäre es mit dem Schneiden?

array[x1range:x2range,y1range:y2range] 

Beispiel:

numpy.array([[1,2,3],[4,5,6],[7,8,9]])[0:2,0:2] 
array([[1, 2], 
     [4, 5]]) 
+0

Hallo, ich habe eine zusätzliche Anforderung hinzugefügt. Tut mir leid, dass ich es vorher nicht erwähnt habe. Ich suchte nach einer Wo-Bedingung, damit ich die Werte aller Elemente ändern kann, die die gegebene Bedingung erfüllen. – n00b

Verwandte Themen