Numpy: Operator pembagian-penugasan menimbulkan kesalahan, pemisahan divisi dan pekerjaan penugasan

Dibuat pada 9 Feb 2018  ·  3Komentar  ·  Sumber: numpy/numpy

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.

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 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.

Semua 3 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat