Numpy array 1.9.2 получение ValueError: не удалось передать входной массив из формы (4,2) в форму (4)

Следующий фрагмент кода работал в numpy 1.7.1, но он дает ошибку значения в текущей версии. Я хочу знать его основную причину.

    import numpy as np
    x = [1,2,3,4]
    y = [[1, 2],[2, 3], [1, 2],[2, 3]]

    a = np.array([x, np.array(y)])

Ниже приводится вывод, который я получаю в numpy 1.7.1

>>>a
array([[1, 2, 3, 4],
       [array([1, 2]), array([2, 3]), array([1, 2]), array([2, 3])]], dtype=object)

Но тот же код вызывает ошибку в версии 1.9.2.

    ----> 5 a = np.array([x, np.array(y)])

ValueError: could not broadcast input array from shape (4,2) into shape (4) 

Я нашел одно возможное решение. Но я не знаю, лучше ли это делать.

b= np.empty(2, dtype=object)
b[:] = [x, np.array(y)]

>>> b
array([[1, 2, 3, 4],
       array([[1, 2],
       [2, 3],
       [1, 2],
       [2, 3]])], dtype=object)

Пожалуйста, предложите решение для достижения желаемого результата. Благодаря

Ответ 1

Что именно вы пытаетесь произвести? У меня нет версии 1.7 для тестирования вашего примера.

np.array(x) создает массив (4,). np.array(y) a (4,2).

Как отмечено в комментарии, в 1.8.1 np.array([x, np.array(y)]) производится

ValueError: setting an array element with a sequence.

Я могу создать массив объектов dtype, состоящий из списка и массива

In [90]: np.array([x, np.array(y)],dtype=object)
Out[90]: 
array([[1, 2, 3, 4],
       [array([1, 2]), array([2, 3]), array([1, 2]), array([2, 3])]], dtype=object)

Я также могу объединить 2 массива, чтобы сделать массив (4,3) (x - это первый столбец)

In [92]: np.concatenate([np.array(x)[:,None],np.array(y)],axis=1)
Out[92]: 
array([[1, 1, 2],
       [2, 2, 3],
       [3, 1, 2],
       [4, 2, 3]])

np.column_stack([x,y]) делает то же самое.


Любопытно, что в dev 1.9 (у меня нет версии 1.9.2) она работает (вроде)

In [9]: np.__version__
Out[9]: '1.9.0.dev-Unknown'

In [10]: np.array([x,np.array(y)])
Out[10]: 
array([[        1,         2,         3,         4],
       [174420780, 175084380,  16777603,         0]])
In [11]: np.array([x,np.array(y)],dtype=object)
Out[11]: 
array([[1, 2, 3, 4],
   [None, None, None, None]], dtype=object)
In [16]: np.array([x,y],dtype=object)
Out[16]: 
array([[1, 2, 3, 4],
   [[1, 2], [2, 3], [1, 2], [2, 3]]], dtype=object)

Итак, похоже, что происходит какое-то развитие.

В любом случае создание нового массива из этого списка и массива 2d неоднозначно. Используйте column_stack (предполагая, что вы хотите получить массив 2d int).


numpy 1.9.0 примечания к выпуску:

Улучшена производительность преобразования списков, содержащих массивы в массивы с использованием np.array. Теперь она эквивалентна скорости np.vstack(list).

При транспонированном y vstack работает:

In [125]: np.vstack([[1,2,3,4],np.array([[1,2],[2,3],[1,2],[2,3]]).T])
Out[125]: 
array([[1, 2, 3, 4],
       [1, 2, 1, 2],
       [2, 3, 2, 3]])

Если работал 1.7.1, а x - имена строк, а не только ints, как в вашем примере, то, вероятно, он создавал массив объектов.