Python中的多维数组迭代

Python中的多维数组迭代,python,numpy,multidimensional-array,glcm,Python,Numpy,Multidimensional Array,Glcm,我想使用滑动窗口计算图像上的一些操作(GLCM)。实现这一目标的准则是: import numpy as np from skimage.feature import greycomatrix, greycoprops from numpy.lib.stride_tricks import as_strided image = np.arange(36).reshape((6,6)) window = 5 result = np.zeros(image.shape) for i in x

我想使用滑动窗口计算图像上的一些操作(GLCM)。实现这一目标的准则是:

import numpy as np
from skimage.feature import greycomatrix, greycoprops

from numpy.lib.stride_tricks import as_strided

image = np.arange(36).reshape((6,6))

window = 5

result = np.zeros(image.shape)
for i in xrange(window/2,image.shape[0]-window/2):
    for j in xrange(window/2,image.shape[1]-window/2):
        sample = image[i-(window/2):i+(window/2)+1, j - (window/2):j+(window/2)+1]
        glcm = greycomatrix(sample, [1], [0], 256, symmetric=False, normed=True)
        result[i,j] = greycoprops(glcm, 'contrast')[0, 0]
它可以工作,但双for循环非常昂贵。我想提高速度,因此,在网络上环顾四周,我尝试使用as_跨步技巧:

例如,要计算第一个窗口的GLCM:

glcm = greycoprops(greycomatrix(y[0,0], [1], [0], 256, symmetric=False, normed=True))[0][0]
我尝试申请所有滑动窗口,如下所示:

glcm[:,:] = greycoprops(greycomatrix(y[:,:], [1], [0], 256, symmetric=False, normed=True))[0][0]
但是在这种情况下,
y[:,:]
没有
ndim==2
作为
y[0,0]
而是
ndim==4
,依此类推。我找不到一种方法以智能的方式对所有子集进行迭代,使
ndim==2
(greycomatrix函数需要)

编辑

我试着使用ravel,在1D向量上工作,所以循环只有1。代码如下:

a = y.ravel()
print a.shape
glcm=np.zeros(a.shape[0]/(window*window))
for i in np.arange(a.shape[0]/(window*window)):
    glcm[i] = greycoprops(greycomatrix(a[i*25:i*25+25].reshape(5,5), [1], [0], 256, symmetric=False, normed=True))[0][0]

result= glcm.reshape(y.shape[0],y.shape[1])

处理时间增加了…

因为你忘了问一个问题,我假设是这样的

我如何让它跑得快

在这种情况下,严酷的事实是,与单个像素操作相比,使用大量切片执行python
for
循环总是相对昂贵的


因此,如果您关心的是速度,那么您应该使用一种语言来实现一些函数,该语言允许您获取python绑定(例如,C with
cpython
),并使用该函数。

对于
,您仍然需要单独访问子数组,例如:

for i in range(y.shape[0]):
    for j in range(y.shape[1]):
        sample = y[i,j,...]
        print sample
甚至

for row in y:
    for sample in row:
        print sample
除了你需要收集结果

在这样的迭代中,
as_stripped
只有在提高子阵列访问效率的情况下才有好处

但是,如果您可以重写GCLM计算以使用4d阵列,它的真正好处就来了。一些
numpy
操作被设计为在一个或两个轴上操作,而其他操作只是“随车而行”。例如,如果您的计算仅包括获取图像的平均值。如果使用
y
,这将是:

np.mean(y, axes=(-2,-1))
np.mean(y, axes=(-2,-1))