np.array () не работает, когда я дал список, включающий два ndarray с различной формой - PullRequest
1 голос
/ 21 мая 2019

Это код.Я сделал список, включающий два ndarray с разной формой.

d = []

a = np.arange(183).reshape(3,61)
b = np.arange(51).reshape(3,17)

d = [a,b]

np.array(d)

Ошибка похожа на приведенную ниже.

 File "C:\Program Files\JetBrains\PyCharm 2019.1.1\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "D:/dev/workspace/rl/test/npcopy.py", line 10, in <module>
    np.array(d)
ValueError: could not broadcast input array from shape (3,61) into shape (3)

np.copy () работает, когда два первых shpae двух ndarrays различаются.но если нет, он не работает, как указано выше.

, если я изменю этот код, как показано ниже,

import numpy as np

d = []

a = np.arange(183).reshape(4, 61)
b = np.arange(51).reshape(3, 17)

d = [a,b]

np.array(d)

, это работает !!так странно !!

Ответы [ 3 ]

3 голосов
/ 21 мая 2019

Поскольку матрицы имеют разные размеры

> a = np.arange(183).reshape(3,61) b = np.arange(51).reshape(3,17)
> d=[np.array(a),np.array(b)] 
>  print(d) for output
> 
> or  d=[a,b]
>  np.concatenate(d, axis=1)
1 голос
/ 21 мая 2019

Когда вы пытаетесь создать массив из массивов, возможны три результата:

Если массивы имеют одинаковую форму, результатом является массив более высокой размерности:

In [295]: np.array((np.zeros((2,3),int),np.ones((2,3),int)))                 
Out[295]: 
array([[[0, 0, 0],
        [0, 0, 0]],

       [[1, 1, 1],
        [1, 1, 1]]])
In [296]: _.shape                                                            
Out[296]: (2, 2, 3)

ЕслиМассивы различаются по форме, результатом может быть массив типа dtype (похожий на list):

In [298]: np.array((np.zeros((2,3),int),np.ones((3,3),int)))                 
Out[298]: 
array([array([[0, 0, 0],
       [0, 0, 0]]),
       array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])], dtype=object)    # shape (2,)

Но для некоторых комбинаций фигур результатом является ошибка:

In [301]: np.array((np.zeros((2,3),int),np.ones((2,4),int)))                 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-301-d67e6685581d> in <module>
----> 1 np.array((np.zeros((2,3),int),np.ones((2,4),int)))

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

В случае ошибки первые измерения совпадают, как и в первом случае.

Иногда для создания массива объектов необходимо начинать с «пустого» и заполнять его.Это более надежно, чем подход np.array(...).

In [303]: arr = np.empty(2, object)                                          
In [304]: arr[:] = np.zeros((2,3),int),np.ones((2,4),int)                    
In [305]: arr                                                                
Out[305]: 
array([array([[0, 0, 0],
       [0, 0, 0]]),
       array([[1, 1, 1, 1],
       [1, 1, 1, 1]])], dtype=object)
In [306]: arr[:] = np.zeros((2,3),int),np.ones((2,3),int)                    
In [307]: arr                                                                
Out[307]: 
array([array([[0, 0, 0],
       [0, 0, 0]]),
       array([[1, 1, 1],
       [1, 1, 1]])], dtype=object)
0 голосов
/ 21 мая 2019

Вместо использования np.copy () я решил использовать copy.deepcopy ().Это работает, даже если первая фигура из двух элементов в списке одинакова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...