我必须处理很多数组,它们包含512x256像素数据,但是大多数条目都是0
,所以我只想保存非零值,即:
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毫秒。有没有办法更快地做到这一点?我必须处理成千上万的这些像素阵列。
答案 0 :(得分: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 ]
答案 1 :(得分: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代码通常是高度优化的,因此它应该比循环解决方案运行得更快(我没有检查它)。