我正在使用 python和我新的。我想要从我的代码中绘制两个数组,其中一个是正确的绘图,但另一个会抛出错误:
/usr/lib64/python2.7/site-packages/matplotlib/axes.py:4511: RuntimeWarning: invalid value encountered in true_divide
c /= np.sqrt(np.dot(x, x) * np.dot(y, y))
Traceback (most recent call last):
File "./track-multiple.py", line 169, in <module>
ax2.xcorr(x2, y2)
File "/usr/lib64/python2.7/site-packages/matplotlib/axes.py", line 4508, in xcorr
c = np.correlate(x, y, mode=2)
File "/usr/lib64/python2.7/site-packages/numpy/core/numeric.py", line 871, in correlate
return multiarray.correlate2(a, v, mode)
ValueError: object too deep for desired array
代码是下一个:
x1 = np.arange(0,len(colunas[0],1)
y1 = columnas[0]
x2 = np.arange(0,len(filas))
y2 = filas
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.xcorr(x1,y1)
ax1.axhline(0, color='black', lw=2)
ax2 = fig.add_subplot(212, sharex=ax1)
ax2.xcorr(x2,y2)
ax2.axhline(0, color='blue', lw=2)
plt.show()
我认为问题在于filas数组,因为他的维度,或者我滥用xcorr方法。如果我在filas和columnas上打印,我会得到这个:
filas =
[[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
...
[0]
[0]
[0]
[0]
[0]]
columnas =
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0]]
这两个数组是用这些句子中的OpenCV库创建的:
columnas = cv2.reduce(fgmask,0,cv.CV_REDUCE_MAX)
filas = cv2.reduce(fgmask,1,cv.CV_REDUCE_MAX)
等待创意!
PD:好的,我发现如何修复错误,我只是将数组文件转换为:
filas = filas[:,0]
但我不确切地知道错误和修复的原因,任何人都可以回答我的问题吗?
答案 0 :(得分:0)
您的变量类型存在混淆。
x1
和x2
是N和M长1D numpy数组。
filas
是1长列表的N长列表。
columnas
是一个长长的列表,其中包含一个M长列表。
x1 = np.arange(0,len(colunas[0],1) # N long numpy array
y1 = columnas[0] # N long list
x2 = np.arange(0,len(filas)) # M long numpy array
y2 = filas # M long list of 1 long lists
Python列表和numpy数组是不同的!您可以使用列表列表在Python中模拟2D数组,但是您无法简单地将它们垂直切片(即获得一列)。但这正是你所需要的。
我认为您应该决定是否要使用Python或Numpy变量类型并与您的选择保持一致。
Python方法:
x1 = range(0,len(colunas[0],1) # N long list
y1 = columnas[0] # N long list
x2 = range(0,len(filas)) # M long list
y2 = [item[0] for item in filas] # M long list
在这里的最后一行,你循环遍历filas
(M循环),对于每个项目(单例列表),你收集单身人士名单中的数字。
Numpy方法:
x1 = np.arange(0,len(colunas[0],1) # N long numpy array
y1 = np.array(columnas[0]) # N long numpy array
x2 = np.arange(0,len(filas)) # M long numpy array
y2 = np.array(filas)[:,0] # M long numpy array
在这里的最后一行,您从filas
列表列表中创建一个2D numpy数组,并使用不允许列表的高级数组切片获取该数组的第一列。