Seite 1 von 1

Clip Array

Verfasst: Dienstag 10. Februar 2015, 10:04
von Lienz20013
Hallo, ich habe eine Frage und zwar habe ich ein array:

Code: Alles auswählen

array([[  6.82666667e+02,   2.05401952e+00],
       [  3.41333333e+02,   1.76906841e+00],
       [  2.27555556e+02,   1.89216345e+00],
       [  3.33659172e-01,   9.78381385e-07],
       [  3.33496173e-01,   8.69459804e-07],
       [  3.33333333e-01,   3.00554987e-07]])
Und nun möchte ich das in der ersten Spalte des array nach einem min = 1 und einem max = 10 gesucht wird und die Werte von Spalte eins die zwischen min und max liegen mit den dazugehörigen Werten aus Spalte zwei ausgegeben werden. Kann mir jemand helfen? Hab es mit

Code: Alles auswählen

np.clip
()
versucht. Hat aber nicht geklappt.

Re: Clip Array

Verfasst: Dienstag 10. Februar 2015, 10:27
von Sirius3
@Lienz20013: das Stichwort heißt logische Indizierung: (arr[:,0]>1) & (arr[:,0]<10).

Re: Clip Array

Verfasst: Dienstag 10. Februar 2015, 10:29
von MagBen

Code: Alles auswählen

import numpy as np
data = np.array([[  6.82666667e+02,   2.05401952e+00],
       [  3.41333333e+02,   1.76906841e+00],
       [  2.27555556e+02,   1.89216345e+00],
       [  3.33659172e-01,   9.78381385e-07],
       [  3.33496173e-01,   8.69459804e-07],
       [  3.33333333e-01,   3.00554987e-07]])

x = data[:,0]
y = data[:,1]

subset = np.logical_and(1<=x, x<=500)

x2 = x[subset]
y2 = y[subset]

print(x2)
print(y2)

Re: Clip Array

Verfasst: Dienstag 10. Februar 2015, 10:35
von Sirius3
@MagBen: Dein subset ist kein Sub-Set sondern eine Maske, ein Vektor mit boolschen Werten. Auch würde ich das Array nicht unnötigerweise trennen, was dann auf folgendes hinausläuft:

Code: Alles auswählen

import numpy as np
data = np.array([[  6.82666667e+02,   2.05401952e+00],
       [  3.41333333e+02,   1.76906841e+00],
       [  2.27555556e+02,   1.89216345e+00],
       [  3.33659172e-01,   9.78381385e-07],
       [  3.33496173e-01,   8.69459804e-07],
       [  3.33333333e-01,   3.00554987e-07]])
 
x = data[:, 0]
mask = (1 <= x) & (x <= 500)
print data[mask, :]

Re: Clip Array

Verfasst: Dienstag 10. Februar 2015, 11:31
von Lienz20013
Cool danke jetzt vieleicht noch was anderes. Wie kann ich das was ich heir widerholt in eine Schleife schreiben:

Code: Alles auswählen

f = data[:, 0]
mask1 = (23.92 <= f) & (f <= 1196) 
mask2 = (0.01 <= f) & (f <= 23.92)

LDS1 = data[mask1, :]
LDS2 = data[mask2, :]

#Part 1
logx,logy = np.log(LDS1[:,0]),np.log(LDS1[:,1])
coeffs1 = np.polyfit(logx,logy,deg=1)                                         
poly = np.poly1d(coeffs1)                                                   
yfit = lambda f_new: np.exp(poly(np.log(LDS1[:,0])))
plt.loglog(LDS1[:,0],yfit(LDS1[:,0]),'r-',zorder=4)

#Part 2
logx,logy = np.log(LDS2[:,0]),np.log(LDS2[:,1])
coeffs2 = np.polyfit(logx,logy,deg=1)                                         
poly = np.poly1d(coeffs2)                                                   
yfit = lambda f_new: np.exp(poly(np.log(LDS2[:,0])))
plt.loglog(LDS2[:,0],yfit(LDS2[:,0]),'r-',zorder=4)
Irgendwie so oder:

Code: Alles auswählen

for part in range(1,3):
aber wie drücke ich z.B LDS 1 aus?

Re: Clip Array

Verfasst: Dienstag 10. Februar 2015, 11:37
von BlackJack
@Lienz20013: Die Schleife müsste über die Werte gehen die sich ändern, also die Grenzen für die Masken wenn ich das auf die Schnelle richtig sehe. Also so etwas wie ``for low, high in [(23.92, 1196), (0.01, 23.92)]:``.

Bei `mask1` und `mask2` scheinen die Operationen in der ”Kombination” keinen Sinn machen.