#python #arrays #python-3.x #numpy
Вопрос:
Python 3 версии 3.8.10, numpy версии 1.19.5
Я ожидал, что этот код
import numpy as np
a = np.ones((2,1))
b = np.ones((2,3))
c = [a,b]
print(np.asarray(c,dtype='object'))
чтобы напечатать то же самое, что
d = np.empty((2,),dtype='object')
d[:] = a,b
print(d)
то есть:
[array([[1.],
[1.]]) array([[1., 1., 1.],
[1., 1., 1.]])]
.
Вместо этого он вызывает ошибку значения:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/tmp/ipykernel_35004/192805992.py in <module>
3 b = np.ones((2,3))
4 c = [a,b]
----> 5 print(np.asarray(c,dtype='object'))
~/.local/lib/python3.8/site-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
81
82 """
---> 83 return array(a, dtype, copy=False, order=order)
84
85
ValueError: could not broadcast input array from shape (2,1) into shape (2)
Эта проблема не возникает, если длины первого измерения массивов, содержащихся в списке, различаются.
Это проблема при преобразовании списка массивов в массив объектов массивов, где первое измерение всех массивов может быть одинаковым.
Ранее Numpy преобразовывал неровные списки массивов в неровный массив объектов массивов. Это поведение было признано устаревшим. К сожалению, предлагаемое исправление указания массива типа «объект» не всегда работает.
Какова текущая идиома для этого преобразования?
Комментарии:
1. Это всегда было проблемой. «Неровное предупреждение» ничего не изменило.
2. Вы уже определили правильный путь, тот, который начинается с
np.empty(x, object)
массива. Это единственный, который когда-либо работал надежно, независимо от сочетания размеров.np.array
предназначен для создания многомерного числового массива. Обработка смешанных фигур-это запасной вариант, который работает с некоторыми фигурами и не работает с другими.3. Хм, У меня был проект, который работал, используя старое поведение. Он перестал работать, выдавая это неровное предупреждение. Это может быть совпадением, но у меня не было времени тщательно обдумать это и не будет времени подробно проработать это в течение нескольких недель. Если это полезно: старый код завернул
array
преобразование в try-catch, а затем по умолчанию привел к приведению в массив объектов, если это не удалось. Возможно, есть какой-то крайний случай, когда это делает что-то полезное, что не автоматически/легко воспроизводится новым поведением.4. Я думаю, что неровное предупреждение было добавлено в версии 1.17. Но кроме этого, я не знаю о каких-либо изменениях в поведении. Я отвечал на подобные вопросы задолго до этого.