#python #numpy #typeerror
#python #numpy #ошибка типа
Вопрос:
Я пытаюсь устранить странную ошибку в странном контексте. Пользователь выполняет часть моего кода и столкнулся с этой ошибкой типа:
File "/usr/local/lib/python2.7/dist-packages/groopm/cluster.py", line 692, in twoWayContraction
(k_partitions, k_keeps) = self.HP.houghPartition(k_dat[:,0], l_dat)
File "/usr/local/lib/python2.7/dist-packages/groopm/cluster.py", line 1377, in houghPartition
imgTag=imgTag)
File "/usr/local/lib/python2.7/dist-packages/groopm/cluster.py", line 1520, in recursiveSelect
(m, ret_point, accumulator) = self.houghTransform(tData.astype(float)[startRange:endRange,:], imShape)
File "/usr/local/lib/python2.7/dist-packages/groopm/cluster.py", line 1749, in houghTransform
flat_indices = Rs * cols Cs
TypeError: unsupported operand type(s) for : 'int' and 'list'
Конкретный фрагмент кода, который выдает эту ошибку, пытается выполнить преобразование Хафа в Numpy land (ПРИМЕЧАНИЕ: я импортировал np.sin как np_sin и т. Д.):
cos_sin_array = np_array(zip([np_sin(dth * theta_index) for theta_index in range(cols)],
[np_cos(dth * theta_index) for theta_index in range(cols)]))
Rs = np_array(np_sum(np_reshape([p * cos_sin_array for p in data], (d_len*cols,2)),
axis=1)/dr).astype('int') half_rows
Cs = np_array(range(cols)*d_len)
flat_indices = Rs * cols Cs
В этом коде cols и half_rows являются целыми числами, dth и dr являются числами с плавающей запятой, а данные представляют собой массив numpy с формой (cols, 2) (т.е. набор координат)
Я могу легко создать ту же ошибку типа в приглашении python, используя:
3 range(9)
Использование:
range(9) 3
выдает:
TypeError: can only concatenate list (not "int") to list
Но, конечно, с numpy:
import numpy as np
3 np.array(range(9))
np.array(range(9)) 3
В порядке. Теперь точная строка, которая вызывает ошибку, — это:
flat_indices = Rs * cols Cs
Типы элементов здесь следующие:
flat_indices = numpy.ndarray * int numpy.ndarray
Но ошибка указывает на то, что:
Rs * cols (numpy.ndarray * int) is an int
Cs (numpy.ndarray) is a list
Я очень смущен. Кто-нибудь сталкивался с чем-то подобным раньше? Я рад отправиться на рыбалку, у кого-нибудь есть идеи, куда я должен бросить свою линию? У меня совершенно нет идей, и мне нужно найти какое-то решение этой проблемы.
ПРИМЕЧАНИЕ: пользователь является рецензентом академической статьи (ссылка на препринт), описывающей этот код, поэтому я не могу связаться с ними напрямую, и я не могу получить данные, которые привели к сбою программы, и я не могу получить подробную информацию о системе, в которой она запущена. Кроме того, этот сбой несколько углублен в выполнение кода.
Поэтому, по сути, я не могу воспроизвести его с исходными данными и не могу предоставить некоторые тестовые данные, которые будут его воспроизводить.
Наконец, вот рассматриваемый код, вырезанный из контекста для тех, кто хочет попробовать получить ошибку.
import numpy as np
np.seterr(all='raise')
(rows, cols) = (10000, 10000)
data = np.array([[4,4]] * cols)
d_len = len(data)
half_rows = rows/2
if half_rows == 0:
half_rows = 1
rows = 2
rmax = np.hypot(rows, cols)
dr = rmax / (half_rows)
dth = np.pi / cols
accumulator = np.ones((rows * cols))*255
cos_sin_array = np.array(zip([np.sin(dth * theta_index) for theta_index in range(cols)],
[np.cos(dth * theta_index) for theta_index in range(cols)]))
Rs = np.array(np.sum(np.reshape([p * cos_sin_array for p in data], (d_len * cols, 2)),
axis=1)/dr).astype('int') half_rows
Cs = np.array(range(cols)*d_len)
flat_indices = Rs * cols Cs
Я рад попробовать все, что предлагается, спасибо.
Редактировать:
Основываясь на комментарии Akavall, я могу создать точную ошибку типа, установив Cs в:
x = []
k = 0
for cs in Cs:
if k == 10:
x.append(cs)
else:
fred = [cs]
x.append(fred)
k = 1
Cs = np.array(x)
(после того, как он был установлен изначально, конечно …)
Итак, Cs выглядит так: [[0], [1], [2], [3], [4], … , 9, [10], … ]
Я знаю, что это не то, что происходит в коде. Но я также не знаю, почему это вызывает ошибку типа. Если кто-нибудь может объяснить, что происходит под капотом, чтобы вызвать эту конкретную ошибку типа в этом конкретном массиве, это было бы подспорьем и может помочь мне приблизиться к решению.
Комментарии:
1. Это определенно странно. Кроме #1: почему вы импортируете половину numpy, но ссылаетесь на нее как
np_array
, а не простоnp.array
? Помимо #2: вы отказываетесь от многих преимуществ использования numpy в первую очередь, используя понимание кода на уровне Pythonzip
и list вместо того, чтобы использовать преимущества векторизованных операций numpy.2. Я думаю
Cs
, что orRs
является либо массивом списков, либо содержит список.3. @Akavall: интересная идея!
Rs
выглядит более вероятнымCs
, чем то, что каким-то образом закончилось сobject
dtype.4. Это похоже на ошибку управления версиями numpy. Знаете ли вы целевую версию numpy, на которой это выполняется? Я работаю на версии 1.5.1 без ошибок. (примечание: почему
d_len
иcols
разные переменные?)5. @DSM В сторону #1: это привычка и, возможно, некоторая преждевременная оптимизация. Я часто вызываю эти функции numpy, поэтому мне нравится использовать синтаксис типа from X import Y, но многие функции numpy такие же / похожие на встроенные и математические, отсюда и np_ . Возможно, это не проблема в этом конкретном фрагменте кода, но по всему проекту она возникает, и я хочу согласованности. Помимо 2: чем быстрее, тем лучше, numpy здесь заключается в том, чтобы избежать вложенных циклов for, но это лучшее, что я мог сделать, рад услышать предложения.