NumPy размер массива неправильной формы - PullRequest
0 голосов
/ 02 августа 2020

Я новичок в numpy и пытаюсь понять, как работают многомерные измерения.

У меня 300 numpy массивов измерений (280, 190, 3). Когда я добавляю все эти массивы в список и конвертирую его в массив numpy (я думаю, что именно здесь я делаю что-то не так), я ожидаю, что его форма будет (300, 280, 190, 3), но все, что я получаю, это (300,) как если бы это был одномерный массив.

Не могли бы вы сказать мне, что я сделал неправильно? Любая дополнительная информация приветствуется. Спасибо.

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Используйте стек numpy, чтобы складывать массивы отдельно. Документация: https://numpy.org/doc/stable/reference/generated/numpy.stack.html

0 голосов
/ 02 августа 2020

Чтобы проиллюстрировать случай 1d рваного предупреждения:

In [461]: alist = [np.ones((10,5,3)), np.ones((10,5,3)), np.ones((9,5,3))]                           

In [463]: np.array(alist).shape                                                                      
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
  #!/usr/bin/python3
Out[463]: (3,)

stack в том же случае выдает ошибку:

In [464]: np.stack(alist)                                                                            
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-464-724d9c1d0554> in <module>
----> 1 np.stack(alist)

<__array_function__ internals> in stack(*args, **kwargs)

/usr/local/lib/python3.6/dist-packages/numpy/core/shape_base.py in stack(arrays, axis, out)
    425     shapes = {arr.shape for arr in arrays}
    426     if len(shapes) != 1:
--> 427         raise ValueError('all input arrays must have the same shape')
    428 
    429     result_ndim = arrays[0].ndim + 1

ValueError: all input arrays must have the same shape

Если все формы совпадают:

In [465]: alist = [np.ones((10,5,3)), np.ones((10,5,3)), np.ones((10,5,3))]                          
In [466]: np.array(alist).shape                                                                      
Out[466]: (3, 10, 5, 3)
In [467]: np.stack(alist).shape                                                                      
Out[467]: (3, 10, 5, 3)

Чтобы создать 1d-объектный массив из списка массивов одинакового размера, нам нужно проделать некоторую дополнительную работу:

In [468]: arr = np.empty(3,object)                                                                   
In [469]: arr[:] = alist                                                                             
In [470]: arr.shape                                                                                  
Out[470]: (3,)
In [471]: np.array(arr).shape            # np.array doesn't change this                                                                
Out[471]: (3,)
In [472]: np.stack(arr).shape            # stack still works                                                            
Out[472]: (3, 10, 5, 3)
0 голосов
/ 02 августа 2020

Вот пример:

data1=np.random.random(size=(280, 190, 3))
data2=np.random.random(size=(280, 190, 3))
data1.shape, data2.shape
((280, 190, 3), (280, 190, 3))
np.stack([data1,data2], axis=0).shape
(2, 280, 190, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...