Fungsi numpy.array dan numpy.asarray memiliki perilaku yang terdefinisi dengan baik saat diterapkan ke daftar array: jika array yang terdaftar memiliki dimensi dan ukuran yang sama, daftar tersebut diubah menjadi salah satu dimensi dari array yang dihasilkan (sebut saja " mode 1 "). Jika tidak, array array dikembalikan ("mode 2").
Namun, perilaku numpy.array dan numpy.asarray dalam "mode 2" tampaknya bergantung pada jumlah item dalam array. Kode berikut tidak terlalu elegan dibandingkan dengan kegunaan numpy, tetapi berfungsi:
>>> a = np.array([1, 2, 3])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
array([array([1, 2, 3]), array([[1, 0],
[0, 1]])], dtype=object)
Tapi yang berikut ini tidak:
>>> a = np.array([1, 2])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.4/dist-packages/numpy/core/numeric.py", line 474, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: could not broadcast input array from shape (2,2) into shape (2)
Jelas, masalahnya adalah, ketika numpy.asarray melihat dimensi pertama memiliki panjang yang sama di a
dan b
, ia mencoba menggunakan "mode 1", yang tidak mungkin dilakukan di sini.
EDIT: Saya menggunakan numpy 1.10.4 dan python 3.4.3.
Setuju, logika fallback semacam ini sangat disayangkan. Kita telah membahas untuk tidak membuat array dtype=object
kecuali dtype disediakan secara eksplisit. IMO np.array([a, b], dtype=object)
harus menjadi satu-satunya cara untuk menulis salah satu dari ini - dan tidak perlu melakukan pemeriksaan apa pun pada bentuk.
Memberikan dtype=object
tidak membantu - Anda masih mendapatkan kesalahan yang sama.
Namun, menambahkan array kosong memungkinkan Anda menghindarinya:
arr_of_arr = np.array([np.array([]), a, b])[1:]
Masih ada di 1.14.4
@ppwwyyxx - memang, sebagian karena ini bukan perubahan sepele, sebagian karena ini bukan sesuatu yang dipukul sepanjang waktu, jadi urgensinya relatif rendah (dan tidak banyak orang yang punya waktu untuk berkontribusi ...).
Tapi yang mungkin bisa membantu di sini adalah membuatnya lebih jelas seperti apa perilaku yang diinginkan nantinya. @shoyer juga menyebutkan permintaan lama untuk secara eksplisit meminta dtype=object
jika itu memang diinginkan, jika tidak, menaikkan TypeError
untuk apa pun yang tidak dapat diuraikan sebagai larik numerik atau string (# 5353). Saya telah merenungkan baru-baru ini apakah akan berguna untuk memiliki dtype='structured'
, yang secara ketat akan memberlakukan perbedaan antara daftar sebagai elemen penunjuk dari sebuah array dan tupel sebagai elemen dari dtype terstruktur.
Saya bersedia berkontribusi jika ada yang bisa mengirimi saya beberapa petunjuk tentang apa yang harus dilakukan. Saya baru saja melihat kode terkait di ctors.c, logika konstruktor tampaknya cukup rumit karena perlu menangani berbagai bentuk input.
Masalah yang sama: # 8330
Saya pikir ini mungkin diperbaiki oleh # 11601. Sunting: Tidak.
Jadi, apa yang terjadi di sini kira-kira:
a = np.array([1, 2])
b = np.array([[1, 0], [0, 1]])
out = np.asarray([a, b])
# translates to
out = np.empty((2, 2)) #shape is correctly inferred
out[0,:] = a
out[1,:] = b # error comes from here
Komentar yang paling membantu
Memberikan
dtype=object
tidak membantu - Anda masih mendapatkan kesalahan yang sama.Namun, menambahkan array kosong memungkinkan Anda menghindarinya: