Python np.dstack: слишком много значений для распаковки - PullRequest
0 голосов
/ 15 мая 2018

Экспериментировал с np.dstack и получил ошибку:

ValueError: слишком много значений для распаковки (ожидается 2)

Вот код:

a = np.array((1,2,3))
b = np.array((2,3,4))
for x, y in np.dstack((a,b)):
    print(x,",",y)

решения?

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

dstack возвращает трехмерный массив, поэтому вам необходимо выполнить итерацию по первому индексу массива:

for x, y in np.dstack((a,b))[0]:
    print(x,",",y)

Вы также можете использовать stack :

for x, y in np.stack((a,b), axis=1):
    print(x,",",y)
0 голосов
/ 15 мая 2018

Непонятно, что вы хотите сделать.

Логическая итерация с использованием двух массивов, подобная этой:

In [290]: a = np.array((1,2,3))
     ...: b = np.array((2,3,4))
     ...: 
     ...: 
In [291]: for x,y in zip(a,b):print(x,y)
1 2
2 3
3 4

Или просто используя список zip метод «транспонирования»:

In [292]: list(zip(a,b))
Out[292]: [(1, 2), (2, 3), (3, 4)]

dstack объединяет массив 2 на новой 3-й оси, создавая трехмерный массив:

In [293]: np.dstack((a,b))
Out[293]: 
array([[[1, 2],
        [2, 3],
        [3, 4]]])
In [294]: _.shape
Out[294]: (1, 3, 2)

Повторять это не имеет особого смысла.

0 голосов
/ 15 мая 2018

В вашем случае результат стека по глубине равен

np.dstack((a,b))=
array([[[1, 2],
        [2, 3],
        [3, 4]]])

результат - массив формы (1,3,2). Поэтому, когда вы выполняете итерацию по этому массиву, вы назначаете объект длины 3 кортежу длины 2, так что вы получаете этот ValueError.

Зависит от того, что вы хотите, вы можете либо

for x, y in np.dstack((a,b))[0]:
    print(x,",",y)

или

for x, y, z in np.dstack((a,b)):
    print(x,",",y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...