Ошибка типа: неподдерживаемые типы операндов для : ‘int’ и ‘list’ при использовании numpy

#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 в первую очередь, используя понимание кода на уровне Python zip и list вместо того, чтобы использовать преимущества векторизованных операций numpy.

2. Я думаю Cs , что or Rs является либо массивом списков, либо содержит список.

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, но это лучшее, что я мог сделать, рад услышать предложения.