Numpy Array Verlust der Dimension beim Maskieren

Ich möchte bestimmte Elemente eines Arrays auswählen und eine gewichtete Durchschnittsberechnung anhand der Werte durchführen. Jedoch, mit einer Filterbedingung, zerstört die ursprüngliche Struktur des Arrays. arr der von der Form (2, 2, 3, 2) ist, wird in ein 1-dimensionales Array umgewandelt. Das nützt mir nicht, denn nicht alle diese Elemente müssen später miteinander kombiniert werden (aber Subarrays von ihnen). Wie kann ich diese Abflachung vermeiden?

 >>> arr = np.asarray([ [[[1, 11], [2, 22], [3, 33]], [[4, 44], [5, 55], [6, 66]]], [ [[7, 77], [8, 88], [9, 99]], [[0, 32], [1, 33], [2, 34] ]] ]) >>> arr array([[[[ 1, 11], [ 2, 22], [ 3, 33]], [[ 4, 44], [ 5, 55], [ 6, 66]]], [[[ 7, 77], [ 8, 88], [ 9, 99]], [[ 0, 32], [ 1, 33], [ 2, 34]]]]) >>> arr.shape (2, 2, 3, 2) >>> arr[arr>3] array([11, 22, 33, 4, 44, 5, 55, 6, 66, 7, 77, 8, 88, 9, 99, 32, 33, 34]) >>> arr[arr>3].shape (18,) 

  • TypeError: Nur Längen-1-Arrays können in Python-Skalare konvertiert werden, während sie versuchen, exponentiell Daten einzugeben
  • Python, cPickle, Beizen Lambda-Funktionen
  • Wie man einen String analysiert und ein verschachteltes Array zurückgibt?
  • Identifizieren Sie doppelte Werte in einer Liste in Python
  • Eindimensionale Arrayformen (Länge,) vs. (Länge, 1) vs. (Länge)
  • Numpy - Ersetzen Sie eine Zahl mit NaN
  • 3 Solutions collect form web for “Numpy Array Verlust der Dimension beim Maskieren”

    Kasse numpy.where

    http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html

    Um die gleiche Dimensionalität zu behalten, benötigen Sie einen Füllwert. Im folgenden Beispiel benutze ich 0, aber du könntest auch np.nan benutzen

     np.where(arr>3, arr, 0) 

    kehrt zurück

     array([[[[ 0, 11], [ 0, 22], [ 0, 33]], [[ 4, 44], [ 5, 55], [ 6, 66]]], [[[ 7, 77], [ 8, 88], [ 9, 99]], [[ 0, 32], [ 0, 33], [ 0, 34]]]]) 

    Sie könnten erwägen, ein np.ma.masked_array zu verwenden, um die Untermenge von Elementen np.ma.masked_array , die Ihren Zustand erfüllen:

     import numpy as np arr = np.asarray([[[[1, 11], [2, 22], [3, 33]], [[4, 44], [5, 55], [6, 66]]], [[[7, 77], [8, 88], [9, 99]], [[0, 32], [1, 33], [2, 34]]]]) masked_arr = np.ma.masked_less(arr, 3) print(masked_arr) # [[[[-- 11] # [-- 22] # [3 33]] # [[4 44] # [5 55] # [6 66]]] # [[[7 77] # [8 88] # [9 99]] # [[-- 32] # [-- 33] # [-- 34]]]] 

    Wie Sie sehen können, behält das maskierte Array seine ursprünglichen Abmessungen. Sie können auf die zugrunde liegenden Daten und die Maske über die .data .mask bzw. .data .mask . Die meisten numpy-Funktionen berücksichtigen nicht maskierte Werte, zB:

     # mean of whole array print(arr.mean()) # 26.75 # mean of non-masked elements only print(masked_arr.mean()) # 33.4736842105 

    Das Ergebnis einer elementweisen Operation auf einem maskierten Array und einem nicht maskierten Array wird auch die Werte der Maske beibehalten:

     masked_arrsum = masked_arr + np.random.randn(*arr.shape) print(masked_arrsum) # [[[[-- 11.359989067421582] # [-- 23.249092437269162] # [3.326111354088174 32.679132708120726]] # [[4.289134334263137 43.38559221094378] # [6.028063054523145 53.5043991898567] # [7.44695154979811 65.56890530368757]]] # [[[8.45692625294376 77.36860675985407] # [5.915835159196378 87.28574554110307] # [8.251106168209688 98.7621940026713]] # [[-- 33.24398289945855] # [-- 33.411941757624284] # [-- 34.964817895873715]]]] 

    Die Summe wird nur über die nicht maskierten Werte von masked_arr – man sieht dies mit Blick auf masked_sum.data :

     print(masked_sum.data) # [[[[ 1. 11.35998907] # [ 2. 23.24909244] # [ 3.32611135 32.67913271]] # [[ 4.28913433 43.38559221] # [ 6.02806305 53.50439919] # [ 7.44695155 65.5689053 ]]] # [[[ 8.45692625 77.36860676] # [ 5.91583516 87.28574554] # [ 8.25110617 98.762194 ]] # [[ 0. 33.2439829 ] # [ 1. 33.41194176] # [ 2. 34.9648179 ]]]] 

    Blick auf arr>3 :

     In [71]: arr>3 Out[71]: array([[[[False, True], [False, True], [False, True]], [[ True, True], [ True, True], [ True, True]]], [[[ True, True], [ True, True], [ True, True]], [[False, True], [False, True], [False, True]]]], dtype=bool) 

    arr[arr>3] wählt die Elemente aus, in denen die Maske True . Welche Art von Struktur oder Form möchtest du diese Auswahl haben? Flat ist das Einzige, was Sinn macht, nicht wahr? arr selbst ist nicht verändert

    Sie konnten die Ausdrücke, die nicht die Maske passen,

     In [84]: arr1=arr.copy() In [85]: arr1[arr<=3]=0 In [86]: arr1 Out[86]: array([[[[ 0, 11], [ 0, 22], [ 0, 33]], [[ 4, 44], [ 5, 55], [ 6, 66]]], [[[ 7, 77], [ 8, 88], [ 9, 99]], [[ 0, 32], [ 0, 33], [ 0, 34]]]]) 

    Jetzt können Sie Gewicht Summen oder Durchschnitte über verschiedene Dimensionen zu tun.

    np.nonzero (oder np.where ) könnte auch nützlich sein, so dass Sie die Indizes der ausgewählten Begriffe:

     In [88]: np.nonzero(arr>3) Out[88]: (array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]), array([0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1]), array([0, 1, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 1, 2]), array([1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1])) 
    Python ist die beste Programmiersprache der Welt.