gpt4 book ai didi

numpy - 从NumPy数组中提取 block 或补丁

转载 作者:行者123 更新时间:2023-12-03 23:13:54 24 4
gpt4 key购买 nike

我有一个二维的numpy数组,如下所示:

a = np.array([[1,5,9,13],
[2,6,10,14],
[3,7,11,15],
[4,8,12,16]]


我想将其提取为2 x 2大小的补丁,而无需重复元素。

答案应该完全相同。这可以是3维数组或具有如下元素顺序的列表:

[[[1,5],
[2,6]],

[[3,7],
[4,8]],

[[9,13],
[10,14]],

[[11,15],
[12,16]]]


如何轻松做到?

在我的实际问题中,a的大小为(36,72)。我不能一一做到。我想要编程的方式来做到这一点。

最佳答案

这是一个相当神秘的numpy单层代码,用于生成3-d数组,这里称为result1

In [60]: x
Out[60]:
array([[2, 1, 2, 2, 0, 2, 2, 1, 3, 2],
[3, 1, 2, 1, 0, 1, 2, 3, 1, 0],
[2, 0, 3, 1, 3, 2, 1, 0, 0, 0],
[0, 1, 3, 3, 2, 0, 3, 2, 0, 3],
[0, 1, 0, 3, 1, 3, 0, 0, 0, 2],
[1, 1, 2, 2, 3, 2, 1, 0, 0, 3],
[2, 1, 0, 3, 2, 2, 2, 2, 1, 2],
[0, 3, 3, 3, 1, 0, 2, 0, 2, 1]])

In [61]: result1 = x.reshape(x.shape[0]//2, 2, x.shape[1]//2, 2).swapaxes(1, 2).reshape(-1, 2, 2)


result1就像2维数组的1维数组:

In [68]: result1.shape
Out[68]: (20, 2, 2)

In [69]: result1[0]
Out[69]:
array([[2, 1],
[3, 1]])

In [70]: result1[1]
Out[70]:
array([[2, 2],
[2, 1]])

In [71]: result1[5]
Out[71]:
array([[2, 0],
[0, 1]])

In [72]: result1[-1]
Out[72]:
array([[1, 2],
[2, 1]])


(对不起,我现在没有时间详细介绍其工作方式。也许以后再说……)

这是一个使用嵌套列表推导的不太隐秘的版本。在这种情况下, result2是2维numpy数组的python列表:

In [73]: result2 = [x[2*j:2*j+2, 2*k:2*k+2] for j in range(x.shape[0]//2) for k in range(x.shape[1]//2)]

In [74]: result2[5]
Out[74]:
array([[2, 0],
[0, 1]])

In [75]: result2[-1]
Out[75]:
array([[1, 2],
[2, 1]])

关于numpy - 从NumPy数组中提取 block 或补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31527755/

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