gpt4 book ai didi

python - 使用 Numpy stride_tricks 获取非重叠数组 block

转载 作者:太空狗 更新时间:2023-10-29 17:42:57 24 4
gpt4 key购买 nike

我正在尝试使用 numpy.lib.stride_tricks.as_strided 迭代数组的非重叠 block ,但我无法找到参数的文档,所以我只能得到重叠 block .

例如,我有一个 4x5 数组,我想从中获取 4 个 2x2 block 。我可以排除右侧和底部边缘的额外单元格。

到目前为止,我的代码是:

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], [6,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], [16, 17]]

生成的 block 数组的形状似乎是正确的,但最后两个断言失败了,大概是因为我的形状或步幅参数不正确。我应该为这些设置什么值以获得非重叠 block ?

最佳答案

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,w = a.shape
bh,bw = 2,2
shape = (h/bh, w/bw, bh, bw)
print(shape)
# (2, 2, 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, shape=shape, strides=strides)
print(blocks)
# [[[[ 1 2]
# [ 6 7]]
# [[ 3 4]
# [ 8 9]]]
# [[[11 12]
# [16 17]]
# [[13 14]
# [18 19]]]]

a 中的 1 开始(即 blocks[0,0,0,0]),到达 2(即 blocks[0,0,0,1])是一项。因为(在我的机器上)a.itemsize 是 4 个字节,步幅是 1*4 = 4。这给了我们 strides = (10,2,5,1 )*a.itemsize = (40,8,20,4)

再次从 1 开始,到达 6(即 blocks[0,0,1,0]),是5(即 w)项,因此步幅为 5*4 = 20。这说明了 strides 中的倒数第二个值。

再次从 1 开始,到达 3(即 blocks[0,1,0,0]),是 2(即 bw)项,因此步幅为 2*4 = 8。这说明了 strides 中的第二个值。

最后,从 1 开始,到达 11(即 blocks[1,0,0,0]),是10(即 w*bh)项,所以步幅为 10*4 = 40。所以 strides = (40,8,20,4)

关于python - 使用 Numpy stride_tricks 获取非重叠数组 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8070349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com