我试图使用numpy.lib.stride_tricks.as_striding来迭代数组的非重叠块,但是我无法找到参数的文档,所以我只能得到重叠的块.
例如,我有一个4×5数组,我想从中获得4个2×2块.我很好,右边和下边缘的额外的细胞被排除.
到目前为止,我的代码是:
import sys import numpy as np a = np.array([ [1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],]) sz = a.itemsize h,w = a.shape bh,bw = 2,2 shape = (h/bh,w/bw,bh,bw) strides = (w*sz,sz,w*sz,sz) blocks = np.lib.stride_tricks.as_strided(a,shape=shape,strides=strides) print blocks[0][0] assert blocks[0][0].tolist() == [[1,2],7]] print blocks[0][1] assert blocks[0][1].tolist() == [[3,4],[8,9]] print blocks[1][0] assert blocks[1][0].tolist() == [[11,12],17]]
结果块数组的形状似乎是正确的,但最后两个断言失败,大概是因为我的形状或步幅参数不正确.我应该设置哪些值来获得不重叠的块?
解决方法
import numpy as np n=4 m=5 a = np.arange(1,n*m+1).reshape(n,m) print(a) # [[ 1 2 3 4 5] # [ 6 7 8 9 10] # [11 12 13 14 15] # [16 17 18 19 20]] sz = a.itemsize h,2 shape = (h/bh,bw) print(shape) # (2,2) strides = sz*np.array([w*bh,bw,w,1]) print(strides) # [40 8 20 4] blocks=np.lib.stride_tricks.as_strided(a,strides=strides) print(blocks) # [[[[ 1 2] # [ 6 7]] # [[ 3 4] # [ 8 9]]] # [[[11 12] # [16 17]] # [[13 14] # [18 19]]]]
从1开始(即块[0,0]),到达2(即块[0,1])是一个项目.由于(在我的机器上)a.itemsize是4个字节,所以步幅是1 * 4 = 4.这给了我们strides =(10,5,1)* a.itemsize =(40,20,4).
从1开始,到达6(即块[0,1,是5(即w)项目,所以步幅是5 * 4 = 20.这占第二个最后价值大步.
从1开始,到达3(即块[0,是2(即bw)项目,所以步幅是2 * 4 = 8这是第二个价值大步
最后,从1开始,到达11(即块[1,是10(即w * bh)项,所以步幅是10 * 4 = 40.所以strides =( 40,4).