【发布时间】:2021-10-31 02:04:35
【问题描述】:
我有一个操作 numpy 数组的问题。比如说,给定一个np.array([[[1,2],[3,4]], [[5,6],[7,8]]]) 形式的 3-d 数组,它是一个 (2,2,2) 数组。我想将它操纵成一个(2,4) 数组,这样a = np.array([[1,2,5,6],[3,4,7,8]])。我想知道有没有 numpy 的内置方法,特别是处理这样的问题并且可以很容易地概括。
已编辑:
谢谢大家的回答。他们都摇滚!我想我应该澄清我在原始帖子中“容易概括”的意思。假设给定一个(6,3,2,3) 数组(这是我面临的实际挑战)
a = array([[[[ 10, 20, 30],
[ 40, 40, 20]],
[[ 22, 44, 66],
[ 88, 88, 44]],
[[ 33, 66, 99],
[132, 132, 66]]],
[[[ 22, 44, 66],
[ 88, 88, 44]],
[[ 54, 108, 162],
[216, 216, 108]],
[[ 23, 46, 69],
[ 92, 92, 46]]],
[[[ 14, 28, 42],
[ 56, 56, 28]],
[[ 25, 50, 75],
[100, 100, 50]],
[[ 33, 66, 99],
[132, 132, 66]]],
[[[ 20, 40, 60],
[ 80, 80, 40]],
[[ 44, 88, 132],
[176, 176, 88]],
[[ 66, 132, 198],
[264, 264, 132]]],
[[[ 44, 88, 132],
[176, 176, 88]],
[[108, 216, 324],
[432, 432, 216]],
[[ 46, 92, 138],
[184, 184, 92]]],
[[[ 28, 56, 84],
[112, 112, 56]],
[[ 50, 100, 150],
[200, 200, 100]],
[[ 66, 132, 198],
[264, 264, 132]]]])
我想将它按摩成一个 (3,3,2,2,3) 数组,这样 fora[0,:,:,:,:]
a[0,0,0,:,:] = np.array([[10,20,30],[40,40,20]]);
a[0,1,0,:,:] = np.array([[22,44,66],[88,88,44]]);
a[0,2,0,:,:] = np.array([[33,66,99],[132,132,66]]);
a[0,0,1,:,:] = np.array([[20,40,60],[80,80,40]]);
a[0,1,1,:,:] = np.array([[44,88,132],[176,176,88]]);
a[0,2,1,:,:] = np.array([[66,132,198],[264,264,132]]).
简而言之,最后 3 个最大的块应该与前 3 个最大的块“合并”以形成 3 个(3,2) 块。其余 2 个块,即 (a[1,:,:,:,:], a[2,:,:,:,:]) 遵循相同的模式。
【问题讨论】:
-
numpy.reshape -
小心我问的问题,reshape 并不能解决我的问题。
reshape只会给我np.array([[1,2,3,4],[5,6,7,8]])。 -
我不明白
np.reshape(a, (2,4))没有产生您在问题中显示的预期输出。 -
哦,没关系,你在搞乱其中的值的顺序。好吧,那很微妙。也许您需要先对数组的某些部分进行一些转置?但是你的换位肯定不是标准的,所以我不知道如何完成。
-
我尝试了很多技巧,这个问题比想象的要难。否则,我不会费心发布这个问题。