Numpy: Perilaku pengindeksan dengan elipsis tidak intuitif.

Dibuat pada 27 Jul 2020  ·  6Komentar  ·  Sumber: numpy/numpy

Pengindeksan array dengan elipsis bisa sangat berlawanan dengan intuisi. Misalnya, dalam contoh berikut, pengenalan elips yang berlebihan mengubah bentuk keluaran:

a = np.array([[[False]]])
a[0:0, 0, ..., [0]]
Out[23]: array([], shape=(1, 0), dtype=bool)
a[0:0, 0,  [0]]
Out[24]: array([], shape=(0, 1), dtype=bool)

Menurut saya ini bukan perilaku yang diinginkan, tetapi tampaknya ini berasal langsung dari keputusan desain yang berkaitan dengan penanganan pengindeksan yang rumit .

Informasi versi Numpy / Python:

1.17.3 3.7.5 (default, 25 Okt 2019, 10:52:18)
[Dentang 4.0.1 (tag / RELEASE_401 / final)]

04 - Documentation 33 - Question 57 - Close?

Komentar yang paling membantu

Saya setuju bahwa ini semua membingungkan, dan saya bahkan tidak akan yakin tanpa memeriksa apa yang terjadi di sini. Tapi, sepertinya itu pilihan yang tepat bagi saya.

Mengapa harus benar-benar "tidak terlihat"? ... harus bersikap identik untuk sejumlah dimensi. Untuk melakukan itu, itu harus memicu transpos di semua kasus. Ie bayangkan sesuatu yang diatur sebagai series, ..., color mana ... ditentukan pengguna dan dapat berupa 0-d. Jika Anda menulis sebuah program untuk menangani data itu, Anda akan membutuhkan pengindeksan yang dapat diprediksi dialihkan tidak peduli ke mana ... diperluas (atau tidak diperluas).

Pada akhirnya, ini cukup membingungkan, dan kami harus mengambil .oindex , dan .vindex dll. Dengan lebih serius untuk mengatasinya: https://numpy.org/neps/nep- 0021-advanced-indexing.html

Semua 6 komentar

Ini terlihat seperti kasus sudut yang sangat buruk - saya kira kami menganggap ... memaksa dua indeks lanjutan, 0 dan [0] , untuk dianggap tidak bersebelahan - meskipun sumbu yang mereka indeks _are_ berdekatan.

Kami mengalami masalah ini saat mencoba mereplikasi pengindeksan numpy. Saya pikir ini adalah interaksi aneh antara dua aturan:

  • Ellipsis berkembang menjadi tupel irisan penuh, yang masing-masing dianggap sebagai indeks dasar
  • Indeks lanjutan dan dasar urutan campuran memicu operasi transpos.

Kasus khusus ini dipicu karena tupel 0-d (bila ... digunakan dengan semua indeks yang ada) masih dianggap sebagai blok indeks dasar, padahal seharusnya benar-benar tidak terlihat.

Saya setuju bahwa ini semua membingungkan, dan saya bahkan tidak akan yakin tanpa memeriksa apa yang terjadi di sini. Tapi, sepertinya itu pilihan yang tepat bagi saya.

Mengapa harus benar-benar "tidak terlihat"? ... harus bersikap identik untuk sejumlah dimensi. Untuk melakukan itu, itu harus memicu transpos di semua kasus. Ie bayangkan sesuatu yang diatur sebagai series, ..., color mana ... ditentukan pengguna dan dapat berupa 0-d. Jika Anda menulis sebuah program untuk menangani data itu, Anda akan membutuhkan pengindeksan yang dapat diprediksi dialihkan tidak peduli ke mana ... diperluas (atau tidak diperluas).

Pada akhirnya, ini cukup membingungkan, dan kami harus mengambil .oindex , dan .vindex dll. Dengan lebih serius untuk mengatasinya: https://numpy.org/neps/nep- 0021-advanced-indexing.html

Saya dengan argumen @seberg bahwa perilaku saat ini adalah generalisasi terbaik. Kami pasti bisa memastikan dokumennya lebih jelas.

Saya tidak tahu tentang proposal itu, terima kasih atas referensi @seberg!

Izinkan saya mengulanginya hanya untuk memastikan saya memahami argumen Anda. Katakanlah kita memberi label indeks lanjutan A dan indeks dasar B dan seperti di atas saya memanggil pengurutan ulang op a (digeneralisasikan) transpos. Dalam contoh Anda, kami memiliki empat kasus:

  • [A1, ..., A2] dan [B1, ... A1] : kasus-kasus ini memicu pengalihan ke [A1, A2, ....] dan [A1, B1, ...] terlepas dari bagaimana ... berkembang.
  • [A1, ..., B1] dan [B1, ..., B2] : kasus ini tidak.

Aturan ini konsisten setelah Anda mengetahui kelas apa (A atau B) series dan color , terlepas dari bagaimana ... berkembang. Ini sama dengan memperlakukan ... sebagai blok indeks dasar (berpotensi 0-d). Memperlakukan 0-d ... sebagai kasus khusus akan berakibat buruk karena transpose akan bersyarat pada apakah pengguna lewat dalam array 2-D atau 3-atau-lebih-D. Saya setuju, ini adalah tempat yang buruk.

Intuisi saya bahwa blok 0-d harus tanpa operasi didorong oleh bagaimana tupel berperilaku, di mana untuk i ,

i: int
M: Tuple[int, ...]
N = ()
assert M[:i] + N + M[i:] == M

Ini bertentangan dengan konvensi pengindeksan numpy yang menghasilkan empat kasus di atas tergantung pada apa itu i . Ini lebih berkaitan dengan operasi transpose itu sendiri, daripada bagaimana ... diperlakukan, dan merupakan argumen untuk proposal NEP21.

Selama pengembangan, kami akan mengganti cara kami melakukan pengindeksan dan akan memasukkan ... untuk membuktikan kode di masa mendatang dan benar-benar bingung ketika bentuknya secara ajaib dialihkan. Itu hanya diperburuk oleh kasing kosong ... yang sangat berlawanan dengan intuisi.

Terima kasih sudah melihatnya! Saya bisa mengirimkan dokumen PR jika Anda mau.

@antonl a doc PR selalu diterima, ada banyak perbaikan yang mungkin dilakukan di sini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat