在python上绘制数组时出错

时间:2014-12-02 13:20:02

标签: python opencv matrix plot

我正在使用 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]

但我不确切地知道错误和修复的原因,任何人都可以回答我的问题吗?

1 个答案:

答案 0 :(得分:0)

您的变量类型存在混淆。 x1x2是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数组,并使用不允许列表的高级数组切片获取该数组的第一列。