Numpy не всегда может преобразовать список массивов в объект-массив массивов

#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. Но кроме этого, я не знаю о каких-либо изменениях в поведении. Я отвечал на подобные вопросы задолго до этого.