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.
Tidak ada kesalahan atau peringatan yang dilemparkan, bahkan bagian imajiner itu pun tidak hilang.
1.16.1
3.6.7 (default, 22 Okt 2018, 11:32:17)
[GCC 8.2.0]
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 "
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 "
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.