Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy/scipy,循环子阵列_Python_Numpy_Scipy - Fatal编程技术网

Python numpy/scipy,循环子阵列

Python numpy/scipy,循环子阵列,python,numpy,scipy,Python,Numpy,Scipy,最近我对8x8块的图像数据进行了大量处理。 标准方法是使用嵌套for循环来提取块,例如 for y in xrange(0,height,8): for x in xrange(0,width,8): d = image_data[y:y+8,x:x+8] # further processing on the 8x8-block 我不禁想知道,是否有一种方法可以将此操作矢量化,或者使用numpy/scipy的另一种方法可以替代?某种迭代器 A MWE1

最近我对8x8块的图像数据进行了大量处理。 标准方法是使用嵌套for循环来提取块,例如

for y in xrange(0,height,8):
    for x in xrange(0,width,8):
        d = image_data[y:y+8,x:x+8]
        # further processing on the 8x8-block
我不禁想知道,是否有一种方法可以将此操作矢量化,或者使用numpy/scipy的另一种方法可以替代?某种迭代器

A MWE1:

#/usr/bin/env python
导入系统
将numpy作为np导入
从scipy.fftpack导入dct、idct
导入scipy.misc
将matplotlib.pyplot作为plt导入
def dctdemo(系数=1):
unzig=np.array([
0,  1,  8, 16,  9,  2,  3, 10,
17, 24, 32, 25, 18, 11,  4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
27, 20, 13,  6,  7, 14, 21, 28,
35, 42, 49, 56, 57, 50, 43, 36,
29, 22, 15, 23, 30, 37, 44, 51,
58, 59, 52, 45, 38, 31, 39, 46,
53, 60, 61, 54, 47, 55, 62, 63])
lena=scipy.misc.lena()
宽度、高度=lena.shape
#重建
rec=np.zeros(lena.shape,dtype=np.int64)
#这部分可以矢量化吗?
对于X范围内的y(0,高度,8):
对于x范围内的x(0,宽度,8):
d=lena[y:y+8,x:x+8].aType(np.float)
D=dct(dct(D.T,norm='ortho').T,norm='ortho')。重塑(64)
Q=np.zero(64,dtype=np.float)
Q[unzig[:coefs]]=D[unzig[:coefs]]
Q=Q.重塑([8,8])
q=np.round(idct(idct(q.T,norm='ortho').T,norm='ortho'))
rec[y:y+8,x:x+8]=q.astype(np.int64)
plt.imshow(rec,cmap='gray')
plt.show()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
c=int(sys.argv[1])
除值错误外:
sys.exit()
其他:

如果1在Scikit图像中有一个函数
view\u as\u windows

不幸的是,我将不得不在另一时间完成此答案,但您可以通过以下方式获取窗体中的窗口,并将其传递到
dct

from skimage.util import view_as_windows
# your code...
d = view_as_windows(lena.astype(np.float), (8, 8)).reshape(-1, 8, 8)
dct(d, axis=0)

scikit学习特征提取例程中有一个名为
extract_patches
的函数。您需要指定一个
补丁大小
和一个
提取步骤
。结果将是图像上的一个视图作为面片,面片可能重叠。生成的数组是4D,前两个索引面片,后两个索引面片的像素。试试这个

from sklearn.feature_extraction.image import extract_patches
patches = extract_patches(image_data, patch_size=(8, 8), extraction_step=(4, 4))
这将提供重叠一半的(8,8)大小的面片

请注意,到目前为止,这不会使用额外的内存,因为它是使用跨步技巧实现的。可以通过重塑形状强制复制

patches = patches.reshape(-1, 8, 8)

这基本上会产生一个补丁列表。

目前正在尝试修改它,以便我建议的功能与您的代码配合使用……啊,scikit!浏览了numpy和scipy的API,我找不到任何合适的(也许我没有仔细查看…)
patches = patches.reshape(-1, 8, 8)