Python TypeError:+;的操作数类型不受支持:';int';和';列表';使用numpy时

Python TypeError:+;的操作数类型不受支持:';int';和';列表';使用numpy时,python,numpy,typeerror,Python,Numpy,Typeerror,我试图在一个陌生的环境中解决一个奇怪的错误。用户正在运行某些my,并遇到以下类型错误: 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-packag

我试图在一个陌生的环境中解决一个奇怪的错误。用户正在运行某些my,并遇到以下类型错误:

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中执行Hough变换(注意:我已将np.sin导入为np_sin等):

在这段代码中,cols和half_行是int,dth和dr是float,数据是一个具有形状(cols,2)(即一组坐标)的numpy数组

我可以使用以下命令在python提示符上轻松地生成相同的TypeError:

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:为什么您要导入一半的numpy,但将其称为
np\u数组
,而不是简单的
np.array
?旁白#2:你一开始就放弃了使用numpy的许多好处,因为你使用了Python级别的代码,比如
zip
和列表理解,而不是利用numpy的矢量化操作。我认为
Cs
Rs
要么是一个列表数组,要么包含一个列表。@Akavall:有趣的想法
Rs
看起来比
Cs
更有可能以某种方式使用
对象
dtype。这看起来像是numpy版本控制错误。您知道正在运行此操作的目标numpy版本吗?我在1.5.1上运行,没有错误。(旁注:为什么
d#len
cols
是不同的变量?@DSM除外?#1:这是一种习惯,可能是一些过早的优化。我把这些numpy函数称为lot,所以我喜欢使用from X import Y类型语法,但是numpy的许多函数与内置函数和math相同/相似,因此是np。这可能不是一个问题,在这个确切的代码位,但在整个项目中,它突然出现,我希望一致性。旁白2:越快越好,这里的numpy是为了避免嵌套for循环,但这是我能做的最好的,很高兴听到建议。
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)