2016-06-29 5 views
0

Ich möchte eine etwas dynamische Abfrage basierend auf numpy Array erstellen. Idealerweise sollten die Indizes eines Arrays (uu) unter den Bedingungen für jede Spalte in einem zweiten Array (cond) zurückgegeben werden.flexible Abfrage basierend auf zwei numpy Arrays

Das folgende Beispiel zeigt, was ich vorhabe, und es funktioniert mit einer Schleife. Ich frage mich, ob es eine effizientere Methode gibt. Danke für Ihre Hilfe.

import numpy as np 
# create an array that has four columns, each contain a vector (here: identical vectors) 
n = 101 
u = np.linspace(0,100,n) 
uu = np.ones((4, n)) * u 
# ideally I would like the indices of uu 
#  (so I could access another array of the same shape as uu) 
#  that meets the following conditions: 
#  the condition based on which values in uu should be selected 
#   in the first column (index 0) all values <= 10. should be selected 
#   in the second column (index 1) all values <= 20. should be selected 
cond = np.array([10,20]) 


# this gives the correct indices, but in a series of 1D solutions 
#  this would work as a work-around 
for i in range(cond.size): 
    ix = np.where(uu[i,:] <= cond[i]) 
    print(ix) 


# this seems like a work-around using True/False 
# but here I am not sure how to best convert this to indices 
for i in range(cond.size): 
    uu[i,:] = uu[i,:] <= cond[i] 
print(uu) 
+0

'uu [i,:]' wählt Zeilen und Spalten nicht, nicht wahr? Nicht sicher, ob ich die Frage richtig verstanden habe. – Divakar

+0

Sollte nicht immer so viele Spalten haben wie uu? – rmhleo

Antwort

0

Numpy ermöglicht Arrays direkt vergleichen:

import numpy as np 
# just making my own uu with random numbers 
n = 101 
uu = np.random.rand(n,4) 

# then if you have an array or a list of values... 
cond = [.2,.5,.7,.8] 

# ... you can directly compare the array to it 
comparison = uu <= cond 

# comparison now has True/False values, and the shape of uu 
# you can directly use comparison to get the desired values in uu 
uu[comparison] # gives the values of uu where comparison ir True 

# but if you really need the indices you can do 
np.where(comparison) 
#returns 2 arrays containing i-indices and j-indices where comparison is True