Numpy: np.floor_divide menjatuhkan bagian imajiner secara diam-diam

Dibuat pada 1 Apr 2019  ·  13Komentar  ·  Sumber: numpy/numpy

Contoh kode reproduksi:

import numpy as np
a = np.arange(10) + 1j* np.arange(10)
a
# array([0.+0.j, 1.+1.j, 2.+2.j, 3.+3.j, 4.+4.j, 5.+5.j, 6.+6.j, 7.+7.j,
#           8.+8.j, 9.+9.j])
a / 2
# array([0. +0.j , 0.5+0.5j, 1. +1.j , 1.5+1.5j, 2. +2.j , 2.5+2.5j,
#          3. +3.j , 3.5+3.5j, 4. +4.j , 4.5+4.5j])
a // 2
# array([0.+0.j, 0.+0.j, 1.+0.j, 1.+0.j, 2.+0.j, 2.+0.j, 3.+0.j, 3.+0.j,
#          4.+0.j, 4.+0.j])

Adakah alasan khusus untuk perilaku ini? Saya berharap untuk floor_divide bagian imajiner dan kompleks.

Pesan eror:

Tidak ada kesalahan atau peringatan yang dilemparkan, bahkan bagian imajiner itu pun tidak hilang.

Informasi versi Numpy / Python:

1.16.1
3.6.7 (default, 22 Okt 2018, 11:32:17)
[GCC 8.2.0]

00 - Bug 15 - Discussion numpy.ufunc

Semua 13 komentar

Anda tidak dapat menggunakan fungsi lantai untuk bilangan kompleks.
Lantai Bilangan Kompleks
Juga, kami tidak membagi bagian imajiner dan bagian kompleks secara terpisah. Kami mendapatkan satu bilangan kompleks dengan membagi 2 bilangan kompleks. ( Membagi bilangan kompleks )

Juga,
`>>> (1. + 1.j) // 2

Traceback (panggilan terakhir terakhir):
File "", baris 1, masuk
TypeError: tidak bisa mengambil lantai dari bilangan kompleks.`

Mirip itu harus menunjukkan TypeError .
Saya baru mengenal Open Source. Saya ingin melakukannya. Bisakah seseorang membimbing saya?

Numpy tidak bisa menghitung bilangan kompleks, jadi alih-alih memberikan kesalahan, itu hanya menjatuhkan bagian imajiner. Jadi menurut saya Numpy berfungsi dengan baik

Oke, saya pikir akan lebih baik untuk memberikan setidaknya peringatan, bahwa bagian imajiner dijatuhkan, mirip dengan fungsi lainnya.

Python normal membuat kesalahan, sepertinya kita harus mengikutinya, kecuali seseorang dapat memikirkan kasus penggunaan?

Ya, saya pikir kita harus melempar TypeError.
Bisakah saya mengerjakannya?

Secara pribadi saya bahkan lebih suka a (2 + 2j) // 2 = (1 + 1j), meskipun itu tidak sepenuhnya benar secara matematis.

Tidak yakin apa yang terbaik, sisanya tidak diimplementasikan untuk kompleks (menimbulkan kesalahan). Dan jika kita menemui kesalahan, mungkin kita harus menghentikannya dulu.

Tentu saja Anda dapat mengerjakannya, itu akan perlu untuk menyelami sedikit ke dalam bagaimana ufunc bekerja dan dihasilkan, jadi ini mungkin tidak terlalu sepele, juga mungkin masih ada beberapa diskusi yang diperlukan tentang kemana kita ingin pergi. Itu tidak perlu menghentikan Anda.

"Dalam menghadapi ambiguitas, tolak godaan untuk menebak." menyarankan bahwa itu harus menjadi TypeError .

@ kaivu1999 - untuk mengatasinya, kemungkinan terbaik adalah menghapus tipe kompleks bahkan dari yang dihasilkan di floor_divide ufunc (perhatikan bahwa divmod , remainder , dan modf sudah OK). Lihat di core/src/umath/loops.c.src , dalam hal-hal berikut baris 2321 (kemungkinan hanya menghapus baris 2480-2500).

@mhvk ya, Anda juga harus menyesuaikan numpy/core/code_generators/generate_umath.py , tetapi jika kami ingin menghentikan penggunaan lebih dulu, Anda mungkin harus membuat resolver tipe kustom (mungkin juga menyentuh numpy/core/src/umath/ufunc_type_resolution.c ).

@seberg - tampaknya perilaku saat ini seharusnya dianggap sebagai bug, dan untuk konsistensi dengan remainder dan divmod , kita harus mulai memunculkan kesalahan.

Apakah kita mungkin menginginkan perilaku yang berbeda akan tampak sebagai diskusi terpisah.

Ya, saya sedang melakukannya.
Saya telah mengubah kodenya, dan sekarang ini menunjukkan:
`>>> a // 2

Traceback (panggilan terakhir terakhir):
File "", baris 1, masuk
TypeError: ufunc 'floor_divide' tidak didukung untuk jenis masukan, dan masukan tidak dapat dipaksa dengan aman ke jenis yang didukung sesuai dengan aturan casting '' aman ''
`
Haruskah saya membuat permintaan tarik?

@ kaijun, permintaan tarik akan menjadi awal yang baik. Pastikan untuk memasukkan Fixes #13236 di komentar pertama, yang akan mereferensikan masalah dan PR.

Melakukan pembagian lantai pada bagian nyata dan imajiner masuk akal jika kita mendokumentasikan bahwa hasilnya adalah bilangan bulat Gaussian. Itu tidak akan konsisten dengan Python.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ghost picture ghost  ·  49Komentar

njsmith picture njsmith  ·  97Komentar

rkern picture rkern  ·  166Komentar

sturlamolden picture sturlamolden  ·  68Komentar

gasparka picture gasparka  ·  78Komentar