2017-07-28 3 views
1

so habe ich ein Dataset mit dem Namen data_low die wie folgt aussieht:Wie können Werte eines dreidimensionalen Arrays gedruckt werden, die unter einem bestimmten Wert liegen?

(array([ 0, 0, 0, ..., 30, 30, 30]), array([ 2, 2, 5, ..., 199, 199, 199]), array([113, 114, 64, ..., 93, 94, 96])) 

Und das ist seine Form: (84243,3).

Ich kann einen eindeutigen Wert für die Fällung aus dem Datensatz wie diese:

In [63]: print(data_low[0, 2, 113]) 
Out [63]: 1.74 

Was ich die Werte in meinem Dataset alles drucken zu tun versuche, die einen Wert von weniger als 3,86667 hat. Ich bin ziemlich neu in Python, und weiß nicht wirklich, welche Schleife zu diesem Zweck verwendet werden soll. Hilfe wird sehr geschätzt. Vielen Dank.

EDIT: Hier ist das Programm, das ich derzeit habe. Für einen bestimmten Kontext habe ich ncecat verwendet, um 31 Datensätze zu kombinieren. Aus diesem Grund habe ich drei 1D-Arrays: Das erste Array ist der Tag, und das 2. und 3. stehen für den Längen- und Breitengrad.

data_path = r"C:\Users\matth\Downloads\TRMM_3B42RT\3B42RT_Daily.201001.7.nc4" 
f = Dataset(data_path) 

latbounds = [ -38 , -20 ] 
lonbounds = [ 115 , 145 ] # degrees east ? 
lats = f.variables['lat'][:] 
lons = f.variables['lon'][:] 

# latitude lower and upper index 
latli = np.argmin(np.abs(lats - latbounds[0])) 
latui = np.argmin(np.abs(lats - latbounds[1])) 

# longitude lower and upper index 
lonli = np.argmin(np.abs(lons - lonbounds[0])) 
lonui = np.argmin(np.abs(lons - lonbounds[1])) 

precip_subset = f.variables['precipitation'][ : , lonli:lonui , latli:latui ] 

print(precip_subset.shape) 
print(precip_subset.size) 
print(np.mean(precip_subset)) 

data_low = np.nonzero((precip_subset > 0) & (precip_subset < 3.86667)) 
print(data_low) 

x = list(zip(*data_low))[:] 
xx = np.array(x) 
print(xx.shape) 
print(xx.size) 

for i in range(0,84243,1): 
    print(data_low[i, i, i]) 

OUT:

In [136]: %run "C:\Users\matth\precip_anomalies.py" 
(31, 120, 72) 
267840 
1.51398 
(array([ 0, 0, 0, ..., 30, 30, 30]), array([ 7, 7, 7, ..., 119, 119, 
119]), array([ 9, 10, 11, ..., 23, 53, 54])) 
(13982, 3) 
41946 
[ 0 0 0 ..., 30 30 30] 

TypeErrorTraceback (most recent call last) 
C:\Users\matth\precip_anomalies.py in <module>() 
    53 
    54 for i in range(0,84243,1): 
---> 55  print(data_low[i, i, i]) 

TypeError: tuple indices must be integers, not tuple 
+1

Dies sieht nicht wie ein Array mit der Form '84243x3' aus, sondern wie ein three_tuple mit drei 1d-Arrays. –

+0

Wie möchten Sie sie drucken? Gerade in einer langen Liste, oder ihre Indizes, oder die restlichen Zellen irgendwie "ausgeblendet"? –

+0

Ich benutzte die Liste (zip (* data_low)) [:] und erstellte sie dann in ein numpy Array. Danach fand ich die Größe und es war (84243, 3) –

Antwort

1

Da data_low eine numpy Matrix (basierend auf Ihrer Frage nicht ist, es ist eine 3-Tupel mit drei Arrays) können Sie Maskierung verwenden:

data_low[data_low < 3.86667] 

Dies wird ein 1D numpy Array zurückgeben, das alle Werte enthält, die kleiner als 3,86667 sind.

Wenn Sie diese als Vanille-Python-Liste möchten, können Sie verwenden:

list(data_low[data_low < 3.86667]) 

Aber wenn Sie die weitere Verarbeitung tun möchten (in numpy) Sie besser die numpy Array trotzdem verwenden.

+0

Ich dachte an etwas wie "für i in Reichweite (0, 84243, 1): print (data_low [[i], [i], [i ]]), aber ich bekomme immer einen Fehler, ich brauche Integer-Werte –

+0

Warum schreiben Sie es mit '[i]', und nicht 'i' (wie' print (data_low [i, i, i]) ')? Außerdem solltest du versuchen, die Anzahl der Aufrufe auf Python-Ebene zu minimieren, da numpy effizienter ist –

+0

Wenn ich es so mache, gibt es mir einen Fehler: "Tuple-Indizes müssen ganze Zahlen sein, nicht Tupel" –

Verwandte Themen