Misalkan saya memiliki array NumPy datar a dan ingin mendefinisikan array indeks i untuk mengindeks a dengan dan dengan demikian mendapatkan a lagi oleh a[i].

Saya mencoba

import numpy as np
a = np.array([1,2]).reshape(-1)
i = True

Tapi ini tidak mempertahankan bentuk: a[i] memiliki bentuk (1, 2) sedangkan a memiliki bentuk (2,).

Saya tahu saya bisa membentuk kembali a[i] atau menggunakan i = np.full_like(a, True, dtype=bool). Saya tidak menginginkan keduanya: Bentuk ulang tidak diperlukan jika i sesuai dengan beberapa definisi bersyarat terkadang tidak biasa True tetapi array boolean yang cocok dengan bentuk a. Pendekatan kedua berarti saya memerlukan i yang berbeda untuk melakukan ini pada array dengan bentuk yang berbeda.

Apakah ada sesuatu yang dibangun di NumPy untuk mendapatkan kembali array saat digunakan sebagai indeks?

1
Christoph90 12 Mei 2021, 17:14

1 menjawab

Jawaban Terbaik

Numpy tidak dapat mempertahankan bentuk hasil topeng boolean karena mungkin compang-camping. Ketika Anda memasukkan skalar boolean tunggal, hal-hal menjadi aneh.

Karena itu Anda harus menggunakan indeks mewah. Dengan indeks mewah, bentuk hasil persis dengan bentuk indeks. Untuk array 1-D, berikut ini baik-baik saja:

i = np.arange(a.size)

Untuk dimensi lainnya, Anda dapat membuat tuple pengindeksan lengkap, menggunakan np.indices misalnya. Elemen-elemen dari tuple dapat disiarkan ke bentuk akhir yang diinginkan, sehingga Anda dapat menggunakan sparse=True:

i = np.indices(a.shape, sparse=True)

Jika Anda ingin i menjadi array numpy, Anda dapat mengatur sparse=False, dalam hal ini i akan berbentuk (a.ndim, *a.shape).

Jika Anda ingin menipu, Anda dapat menggunakan irisan. slice(None) adalah objek yang mewakili indeks literal ::

i = (slice(None),) * a.ndim

Atau cukup indeks dimensi pertama saja, yang mengembalikan seluruh array:

i = slice(None)

Atau jika Anda merasa sangat malas, gunakan Ellipsis secara langsung. Ini adalah objek yang mewakili literal ..., artinya :, :, dll, sebanyak yang diperlukan:

i = Ellipsis

Kembali ke opsi topeng boolean, Anda dapat menggunakannya untuk efek yang sama jika Anda membuat larik terpisah untuk setiap dimensi:

i = tuple(np.ones(k, dtype=bool) for k in a.shape)

Anda dapat menghemat sebagian memori dengan hanya mengalokasikan bentuk terbesar dan membuat tampilan:

s = np.ones(max(a.shape), dtype=bool)
i = tuple(s[:k] for k in a.shape)
1
Mad Physicist 12 Mei 2021, 14:43