Numpy: BUG: np.array gagal pada daftar array dengan dimensi yang cocok sebagian

Dibuat pada 23 Mar 2016  ·  8Komentar  ·  Sumber: numpy/numpy

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.

00 - Bug numpy.core

Komentar yang paling membantu

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:]

Semua 8 komentar

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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat