ValueError: несоответствие формы: с одинаковой формой - PullRequest
0 голосов
/ 29 октября 2019

Я получил базовую ошибку со странным выводом, который я не очень хорошо понимаю:

шаг для воспроизведения

arr1 = np.zeros([6,10,50])
arr2 = np.zeros([6,10])
arr1[:, :, range(25,26,1)] = [arr2]

, который генерирует эту ошибку:

ValueError: shape mismatch: value array of shape (1,6,10) could not be broadcast to indexing result of shape (1,6,10)

Может кто-нибудь объяснить, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Поскольку range(25, 26, 1) на самом деле является одним числом, вы можете использовать:

arr1[:, :, 25:26] = arr2[..., None]

или:

arr1[:, :, 25] = arr2

вместо arr1[:, :, range(25,26,1)] = [arr2].

Обратите внимание, что для диапазонов / срезов, которые не сводятся к одному числу, первая строка будет использовать широковещание .

Причина, по которой исходный код не работает, заключается в том, что вы смешиваете массивы NumPyи Python list s несовместимым образом, потому что NumPy интерпретирует [arr2] как имеющую форму (1, 6, 10), в то время как результат ожидает форму (6, 10, 1) (ошибка, которую вы получаете, по существу об этом.)


Приведенное выше решение направлено на то, чтобы убедиться, что arr2 находится в совместимой форме. Другой возможностью было бы изменить форму получателя, что позволило бы вам назначить [arr2], например:

arr1 = np.zeros([50,6,10])
arr2 = np.zeros([6,10])
arr1[25:26, :, :] = [arr2]

Этот метод может быть менее эффективным, поскольку arr2[..., None] - это просто памятьпросмотр тех же данных в arr2, в то время как [arr2] создает (читай: выделяем новую память для) новый объект list, который потребовал бы некоторого приведения (происходящего под капотом) для присвоения массиву NumPy.

1 голос
/ 29 октября 2019

Добавить дополнительное измерение к arr2:

arr1[:, :, range(25,26,1)] = arr2.reshape(arr2.shape + (1,))

Упрощенная запись для range, как здесь используется:

arr1[:, :, 25:26)] = arr2.reshape(arr2.shape + (1,))

slice(25,26,1), или slice(25,26), также может работать; просто чтобы добавить к опциям и возможной путанице.)

Или вставить дополнительную ось в конце arr2:

arr1[..., 25:26] = arr2[..., np.newaxis]

(где ... означает«как можно больше измерений»). Вы также можете использовать None вместо np.newaxis;последнее, вероятно, более явное, но любой, кто знает NumPy, распознает None как вставку дополнительного измерения (оси).

Конечно, вы также можете установить arr2 как трехмерное с самого начала:

arr2 = np.zeros([6,10,1])

Обратите внимание, что вещание работает при использовании слева:

>>> arr1 = np.zeros([50,6,10])   # Swapped ("rolled") dimensions
>>> arr2 = np.zeros([6,10])
>>> arr1[25:26, :, :] = arr2     # No need to add an extra axis

Просто оно не работает при использовании изверно, как в вашем коде.

...