Kehilangan dimensi saat menggunakan numpy array di dalam masked array

Sep 23 2020

Saya memiliki array Masked dan array boolean Numpy yang berisi nilai 3 dimensi. Namun ketika saya menggunakan pengindeksan array numpy di dalam array bertopeng itu menyebabkan hilangnya dimensi. Saya tidak tahu alasannya:

Masked_array = [[[--, 1, --],
                 [--, 1, --],
                 [--, 1, --]]]

Menjalankan garis ini memberi saya

masked_array = masked_array.mask
mm = ~np.logical_and.accumulate(masked_array)
list(masked_array[mm])

keluaran sebagai [1, 1, 1]ganti [[1] [1] [1]]saya tidak bisa memahami kesalahan dan mencoba berbagai metode. Bisakah Anda membantu saya dalam menjelaskan keraguan. Terima kasih

Jawaban

1 yatu Sep 23 2020 at 15:13

Saat mengindeks 2Darray dengan mask dengan bentuk yang sama, Anda mendapatkan 1Darray:

a = np.random.random((4,4))
a[np.random.choice([True,False], (4,4))].shape
# (7,)

Bentuk asli tidak dipertahankan karena sebagai hasil dari pengindeksan boolean Anda mungkin mendapatkan larik bergerigi, yang tidak didukung oleh numpy. Jadi secara default, itu hanya meratakan hasil untuk Anda seperti pada contoh di atas.

Jika Anda mengetahui bahwa sebagai akibatnya, Anda akan mengindeks kolom, dan ingin mempertahankan 2Dbentuknya, Anda selalu dapat menambahkan sumbu baru:

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]])

Meskipun seperti yang disebutkan, Anda akan selalu berakhir dengan deretan yang diperas, yang harus Anda bentuk kembali sesuai dengan kebutuhan Anda.