ValueError: операнды не могут быть переданы вместе с фигурами (109,109) (2,) (109,109)

Я использую astropy в ноутбуках jupyter для обработки подходящих файлов. Я использую стороннее приложение под названием pyKLIP.

Может ли кто-нибудь объяснить конструкцию этого сообщения об ошибке, поскольку в нем есть ТРИ НАБОРА круглых скобок (дословно, sic). Я не нашел такой конструкции этого сообщения об ошибке с тремя наборами скобок, что затрудняет расшифровку того, что ему нужно.

ValueError: operands could not be broadcast together with shapes (109,109) (2,) (109,109)

109 109 может быть только разрешением подходящего изображения, хранящегося внутри массива numpy из 91 отдельного кадра из 109 строк на 109 столбцов.

2 я еще не могу понять, потому что я не могу заставить операторы печати печатать внутри сторонних функций. Единственные 2, о которых я знаю, - это массив из 91 набора центра x и центра y.

Спецификация, входящая в стороннее приложение, требует:

input = Массив формы (N,y,x) для N изображений формы (y,x)

center = Массив формы (N,2) для N центров ввода в формате [x_cent, y_cent]

Если я напечатаю эти члены как размер и форму, я получу:

dataset.input.size      :  1081171
dataset.input.shape     :  (91, 109, 109)
dataset.centers.size    :  182
dataset.centers.shape   :  (91, 2)

Любые указатели на расшифровку этой широковещательной ошибки приветствуются. Спасибо.


person user3027106    schedule 24.05.2020    source источник
comment
Такие сообщения могут появляться, когда вы применяете какой-либо оператор с аргументом out=, например a = np.random.rand(109, 109); b = np.random.rand(2); np.add(a, b, out=a).   -  person V. Ayrat    schedule 24.05.2020
comment
Можете ли вы объяснить, что вы пытаетесь сделать? Это общее сообщение об ошибке, когда массивы не совпадают. Например, сложение двух массивов разного размера или умножение матриц на (n x k) и (m x l), где k != m.   -  person Nathan Furnal    schedule 24.05.2020
comment
2 я еще не могу понять, потому что я не могу заставить операторы печати печатать внутри сторонних функций, если вы хотите попробовать отладить что-то самостоятельно, выполните поиск о том, как использовать pdb. Это бесценный навык.   -  person Iguananaut    schedule 24.05.2020


Ответы (2)


При поиске справки по подобным ошибкам сосредоточьтесь на первой части сообщения, broadcast together. THREE SETS of parentheses относится к вашему случаю. Зная broadcasting rules, очевидно, что эти 3 массива не будут работать вместе. Ваша задача определить, какие из них.

То, что вы нашли:

dataset.input.shape     :  (91, 109, 109)
dataset.centers.shape   :  (91, 2)

предполагает, что ваш код (или то, что называется) выполняет какую-то «пакетную» итерацию по первому измерению этих массивов, делая что-то с

dataset.input[i]
dataset.centers[i]

Но без полной трассировки мы не можем сказать больше. Даже с помощью трассировки может быть сложно отследить немедленную ошибку до ее источника в вашем коде.

person hpaulj    schedule 24.05.2020

Я бы предпочел отдать должное человеку, чья рекомендация позволила найти решение.

Игуанавт сказал получить отладчик. Я исследовал отладчики, решил, что Python Visual Debugger — это билет, а затем обнаружил, что для этого требуется Anaconda. Установил Anaconda, затем pyklip для Anaconda, затем сделал свои собственные операторы печати внутри модулей pyklip Anaconda, и по какой-то причине модули pyklip Anaconda смогли выполнить мои операторы печати.

Итак, я увидел, что система *желала добавить ДВА отдельных двухэлементных кортежа с ОДНИМ экземпляром, но *подавала двухэлементный кортеж с ОДНИМ экземпляром + массив NNN-экземпляров из двухэлементных кортежей. Это был именно тот номер строки, о котором говорилось в сообщении об ошибке.

Мне нужно будет проверить больше, но я думаю, что спецификация могла быть достаточно расплывчатой, чтобы сделать неверные выводы. Я * думаю, что «centers = Массив формы (N, 2) для N центров ввода в формате [x_cent, y_cent]» должен говорить эквивалент «формы (1,2)». (Кортежи IIRC не имеют элементов формы..)

Может ли кто-нибудь сказать, как и почему установка Anaconda сторонней библиотеки, pyklip, позволяет успешно выполнять операторы печати внутри кода pyklip, тогда как репозиторий pyklip на github не позволяет успешно выполнять операторы печати внутри кода pyklip?

Материальный ответ на начальный вопрос заключается в том, что в столбце 109 строк на 109 значение каждой ячейки должно быть смещено вверх или вниз на очень небольшую величину, чтобы произвести повторное центрирование изображения. Он не мог достичь этого, потому что dx и dy, различия между ДВУМЯ отдельными двухэлементными кортежами ОДНОГО экземпляра, не могли быть правильно рассчитаны.

person user3027106    schedule 25.05.2020