Maaf jika ini adalah masalah yang diketahui, saya mencarinya tetapi ada begitu banyak hasil ...
Ini bekerja:
import numpy as np
a = np.array([1, 2, 3])
a = a / 4
Tapi ini menimbulkan kesalahan:
import numpy as np
a = np.array([1, 2, 3])
a /= 4
Yaitu:
TypeError: No loop matching the specified signature and casting
was found for ufunc true_divide
Ini mengejutkan karena saya berharap mereka melakukan hal yang sama.
Menggunakan numpy versi 1.14.0.
Saya berasumsi bahwa Anda menggunakan Python 3. Ini adalah perilaku yang diharapkan pada Python 3. Hasil dari a / 4
tidak akan menjadi array integer tetapi array floating point. Ketika Anda hanya menetapkan kembali hasil itu dengan baris a = a / 4
, tidak apa-apa. Ini pada dasarnya mengubah kode menjadi a = np.true_divide(a, 4)
yang membuat array floating point baru dan menetapkan kembali nama a
untuk itu.
Saat Anda mencoba melakukan penugasan di tempat, true_divide
ufunc diminta untuk menampilkan kembali ke array bilangan bulat a
: np.true_divide(a, 4, out=a)
. Tidak ada implementasi true_divide
yang mengambil dua argumen integer dan menghasilkan integer lain, jadi Anda mendapatkan pengecualian.
Terima kasih atas penjelasan yang jelas, itu masuk akal. Di bawah ini membantu saya memahami perbedaannya:
>>> a = [1 ,2, 3]
>>> b = a
>>> id(a) == id(b)
True
>>> a += [4, 5, 6] # list object is changed, no new object created
>>> id(a) == id(b)
True
>>> a = a + [4, 5, 6] # new object created, and assigned to `a`
>>> id(a) == id(b)
False
Jika saya mengerti dengan benar, fakta bahwa tidak ada objek baru yang dibuat dengan +=
, adalah analogi dari out=a
.
Salah satu cara mengatasi masalah ini adalah dengan menggunakan dtype=float
pada saat pembuatan array.
Betul sekali.
Komentar yang paling membantu
Saya berasumsi bahwa Anda menggunakan Python 3. Ini adalah perilaku yang diharapkan pada Python 3. Hasil dari
a / 4
tidak akan menjadi array integer tetapi array floating point. Ketika Anda hanya menetapkan kembali hasil itu dengan barisa = a / 4
, tidak apa-apa. Ini pada dasarnya mengubah kode menjadia = np.true_divide(a, 4)
yang membuat array floating point baru dan menetapkan kembali namaa
untuk itu.Saat Anda mencoba melakukan penugasan di tempat,
true_divide
ufunc diminta untuk menampilkan kembali ke array bilangan bulata
:np.true_divide(a, 4, out=a)
. Tidak ada implementasitrue_divide
yang mengambil dua argumen integer dan menghasilkan integer lain, jadi Anda mendapatkan pengecualian.