gpt4 book ai didi

python - 将二维数组切片成更小的二维数组

转载 作者:行者123 更新时间:2023-11-28 19:05:35 28 4
gpt4 key购买 nike

有没有办法将 numpy 中的二维数组分割成更小的二维数组?

示例

[[1,2,3,4],   ->    [[1,2] [3,4]   
[5,6,7,8]] [5,6] [7,8]]

所以我基本上想将一个 2x4 数组缩减为 2 个 2x2 数组。寻找用于图像的通用解决方案。

最佳答案

another question几个月前,这让我想到了使用 reshapeswapaxes 的想法。 h//nrows 很有意义,因为它将第一个 block 的行保持在一起。您需要 nrowsncols 作为形状的一部分也是有道理的。 -1 告诉 reshape 填写使 reshape 有效所需的任何数字。有了解决方案的形式,我就不断尝试,直到找到有效的公式。

您应该能够使用 reshapeswapaxes 的某种组合将您的数组分成“ block ”:

def blockshaped(arr, nrows, ncols):
"""
Return an array of shape (n, nrows, ncols) where
n * nrows * ncols = arr.size

If arr is a 2D array, the returned array should look like n subblocks with
each subblock preserving the "physical" layout of arr.
"""
h, w = arr.shape
assert h % nrows == 0, f"{h} rows is not evenly divisible by {nrows}"
assert w % ncols == 0, f"{w} cols is not evenly divisible by {ncols}"
return (arr.reshape(h//nrows, nrows, -1, ncols)
.swapaxes(1,2)
.reshape(-1, nrows, ncols))

c

np.random.seed(365)
c = np.arange(24).reshape((4, 6))
print(c)

[out]:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]

进入

print(blockshaped(c, 2, 3))

[out]:
[[[ 0 1 2]
[ 6 7 8]]

[[ 3 4 5]
[ 9 10 11]]

[[12 13 14]
[18 19 20]]

[[15 16 17]
[21 22 23]]]

我发布了一个 inverse function, unblockshaped, here和 N 维泛化 here .概括可以让我们更深入地了解该算法背后的推理。


注意还有superbatfish'sblockwise_view .它安排了不同格式的 block (使用更多轴)但它具有(1)的优点总是返回一个 View ,并且(2)能够处理任何数组维度。

关于python - 将二维数组切片成更小的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47443293/

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