python – 使用Numpy stride_tricks获取非重叠的数组块

前端之家收集整理的这篇文章主要介绍了python – 使用Numpy stride_tricks获取非重叠的数组块前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用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).

猜你在找的Python相关文章