numpy массив, содержащий многомерные numpy массивы с переменной формой - PullRequest
3 голосов
/ 25 апреля 2020

У меня есть список numpy массивов, форма которых является одной из следующих: (10,4,4,20), (10,4,6,20). Я хочу преобразовать список в массив numpy. Так как они имеют разные формы, я не могу просто сложить их. Итак, я подумал о создании массива numpy, рассматривая каждый массив как объект, как в здесь . Я попробовал следующее:

b = numpy.array(a)
b = numpy.array(a, dtype=object)

, где a - список numpy массивов. Оба выдают мне следующую ошибку:

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

Как мне преобразовать этот список в массив numpy?

Пример :

import numpy
a = [numpy.random.random((10,4,4,20)),
     numpy.random.random((10,4,6,20)),
     numpy.random.random((10,4,6,20)),
     numpy.random.random((10,4,4,20)),
     numpy.random.random((10,4,6,20)),
     numpy.random.random((10,4,6,20)),
     numpy.random.random((10,4,4,20)),
     numpy.random.random((10,4,4,20)),
     numpy.random.random((10,4,6,20))
    ]
b = numpy.array(a)

Вариант использования :
Я знаю, numpy массив объектов не эффективен, но я не выполняю над ними никаких операций. Обычно у меня есть список массивов одинаковой формы numpy, и я могу легко их сложить. Этот массив передается другой функции, которая выбирает только определенные элементы. Если мои данные массива numpy, я могу просто сделать b[[1,3,8]]. Но я не могу сделать то же самое со списком. Я получаю следующую ошибку, если я пытаюсь сделать то же самое со списком

c = a[[1,3,8]]
TypeError: list indices must be integers or slices, not list

1 Ответ

3 голосов
/ 25 апреля 2020

np.array(alist) создаст массив dtype объекта, если массив списков отличается в первом измерении. Но в вашем случае они отличаются в 3-м, вызывая эту ошибку. По сути, он не может однозначно определить, где заканчивается содержащее измерение и где начинаются объекты.

In [270]: alist = [np.ones((10,4,4,20),int), np.zeros((10,4,6,20),int)]                                
In [271]: arr = np.array(alist)                                                                        
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-271-3fd8e9bd05a9> in <module>
----> 1 arr = np.array(alist)

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

Вместо этого нам нужно создать массив объектов правильного размера и скопировать в него список. Иногда эта копия все еще выдает ошибки трансляции, но здесь, кажется, все в порядке:

In [272]: arr = np.empty(2, object)                                                                    
In [273]: arr                                                                                          
Out[273]: array([None, None], dtype=object)
In [274]: arr[:] = alist                                                                               
In [275]: arr                                                                                          
Out[275]: 
array([array([[[[1, 1, 1, ..., 1, 1, 1],
         [1, 1, 1, ..., 1, 1, 1],
         [1, 1, 1, ..., 1, 1, 1],
...
         [0, 0, 0, ..., 0, 0, 0],
         [0, 0, 0, ..., 0, 0, 0]]]])], dtype=object)
In [276]: arr[0].shape                                                                                 
Out[276]: (10, 4, 4, 20)
In [277]: arr[1].shape                                                                                 
Out[277]: (10, 4, 6, 20)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...