Perdita di dimensione quando si utilizza un array numpy all'interno di un array mascherato
Avevo un array mascherato e un array booleano Numpy contenente valori tridimensionali. Tuttavia, quando ho utilizzato l'indicizzazione dell'array numpy all'interno di un array mascherato, ha portato alla perdita di dimensioni. Non sono riuscito a capire il motivo:
Masked_array = [[[--, 1, --],
[--, 1, --],
[--, 1, --]]]
L'esecuzione di questa linea mi ha dato
masked_array = masked_array.mask
mm = ~np.logical_and.accumulate(masked_array)
list(masked_array[mm])
l'uscita come [1, 1, 1]invece di [[1] [1] [1]]non riuscivo a capire l'errore e ho provato vari metodi. Mi aiuti per favore a chiarire il dubbio. Grazie
Risposte
Quando si indicizza un 2Darray con una maschera con la stessa forma, si ottiene un 1Darray:
a = np.random.random((4,4))
a[np.random.choice([True,False], (4,4))].shape
# (7,)
La forma originale non viene preservata perché come risultato dell'indicizzazione booleana probabilmente otterrai un array frastagliato, che numpy non supporta. Quindi, per impostazione predefinita, appiattisce il risultato per te come nell'esempio sopra.
Se sai di sapere che di conseguenza indicizzerai una colonna e desideri preservare la 2Dforma, puoi sempre aggiungere un nuovo asse:
a = np.array([[[0, 1, 0],
[0, 1, 0],
[0, 1, 0]]])
masked_array = np.ma.masked_array(a, a==0)
mask = masked_array.mask
mm = ~np.logical_and.accumulate(mask)
masked_array[mm,None].data
array([[1],
[1],
[1]])
Anche se, come accennato, ti ritroverai sempre con un array ristretto, che dovrai rimodellare in base alle tue esigenze.