2013-08-15 5 views
2

я должен обрабатывать множество массивов, они содержат 512x256 пикселей, подобные данные, однако большинство элементов являются 0, поэтому я хочу, чтобы сохранить только ненулевые значения, то есть:Python: массив процесс быстрее

import numpy as np 
import time 

xlist=[] 
ylist=[] 
zlist=[] 

millis = time.time()*1000 
ar = np.zeros((512,256),dtype=np.uint16) 

for x in range(0,512): 
    for y in range(0,256): 
     if (0<ar[x][y]<1000): 
      xlist.append(x) 
      ylist.append(y) 
      zlist.append(ar[x][y]) 

print time.time()*1000-millis 

это занимает около 750 мс на моем компьютере. Есть ли способ сделать это быстрее? Я должен обработать десятки тысяч этих пиксельных массивов.

+1

Похоже, вы имеете дело с разреженными матрицами. Scipy дает вам некоторые типы классов на выбор: http://docs.scipy.org/doc/scipy/reference/sparse.html – heltonbiker

+0

В общем, если вы можете избежать написания циклов при работе с массивами numpy, вы можете получить гораздо более высокую производительность , В качестве побочного примечания, если это python 2.x, просто изменение 'range' на' xrange' может привести к небольшому увеличению производительности. – SethMMorton

ответ

3

Вы можете попробовать что-то вроде этого:

ar = np.zeros((512,256),dtype=np.uint16) 

# there should be something here to fill ar  

xs = np.arange(ar.shape[0]) 
ys = np.arange(ar.shape[1]) 

check = (0 < ar) & (ar < 1000) 
ind = np.where(check) 
xlist = xs[ ind[0] ] 
ylist = ys[ ind[1] ] 
zlist = ar[ check ] 
+0

Да, это здорово! Благодаря! – Tommos

3

SciPy обеспечивает очень хорошую поддержку для разреженных матриц, которые должны обеспечить хорошее решение вашей проблемы. Ознакомьтесь с документацией модуля scipy.sparse here.

Чтобы преобразовать Numpy массива координат на основе (COO) разреженную матрицу, как вы делаете с вашим кодом выше, вы можете выполнить следующие действия:

import numpy as np 
from scipy import sparse 

#your original matrix 
A = numpy.array([[1,0,3],[0,5,6],[0,0,9]]) 

#We let scipy create a sparse matrix from your data 
sA = sparse.coo_matrix(A) 

#The x,y,z 

xlist,ylist,zlist = sA.row,sA.col,sA.data 

print (xlist,ylist,zlist) 

#This will print: (array([0, 0, 1, 1, 2], dtype=int32), array([0, 2, 1, 2, 2], dtype=int32), array([1, 3, 5, 6, 9])) 

Поскольку SciPy код обычно оптимизированное это должно работать быстрее, чем ваше циклическое решение (я не проверял его).

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