2014-12-02 3 views
0

Я работаю с python и я новичок. Я хочу построить два массива из моего кода, один из них сюжет правильно, но другой один бросает мне ошибку:Ошибка при построении массива на 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. Если я отпечатанный на фил и 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: OK Я считаю, как исправить ошибку, я просто преобразовать массив фила с:

filas = filas[:,0] 

Но я не знаю точно причину ошибки, а также исправление, может кто-нибудь ответить мои вопросы?

ответ

0

Существует путаница с вашими переменными типами. x1 и x2 - это N и M длинные массивы 1D numpy. filas является N длинным списком из 1 длинного списка. columnas - это 1 длинный список, содержащий длинный список 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 различны! Вы можете имитировать 2D-массив в Python со списком списков, но вы не сможете просто отрезать их по вертикали (т. Е. Получить один столбец). Но это именно то, что вам нужно.

Я думаю, вы должны решить, хотите ли вы использовать типы переменных Python или Numpy и быть в соответствии с вашим выбором.

Питон подход:

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 петель), и для каждого элемента (Singleton список), вы собираете номер внутри списка одноплодной.

В 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 

В последней строке здесь, вы создаете 2D Numpy массив из вашего filas списка списков, и взять первый столбец этого массива с усовершенствованной нарезкой массива, не допускаются для списков.

+0

Я забыл поблагодарить вас, это было полезно для меня: D –

Смежные вопросы