我有一个numpy数组,它是这样组织的,其中2行组成一个块,所以总共有4个块:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]])
我想转换数组,这样每隔一个块就追加到第一个块的列中:
array([[0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1.],
[2., 2., 2., 2., 3., 3., 3., 3.],
[2., 2., 2., 2., 3., 3., 3., 3.]])
尝试了块上的for循环的蛮力方法。这工作,但寻找一个更快的方法。任何见解赞赏!
6条答案
按热度按时间p4rjhz4m1#
用些变形和换位的魔法怎么样?
输出:
说明:
在逻辑上有4个维度在起作用:
W
宽。H
高。Y
,在这个例子中是Y = 2
;Y
明确地确定。在这种情况下,对于N = 4
总块,我们可以说网格的高度为X = N / Y = 2
。当前,存储器顺序是
(X Y H) W
,这意味着预想的“轴”X, Y, H
在原始数组中的轴0上被分组在一起,因此长度为X * Y * H = 8
。您所需的输出数组的排序为
(X H) (Y W)
。因此:u0sqgete2#
另一种可能的解决方案:
输出:
ukdjmx9f3#
您也可以通过切片来实现:
bbmckpt74#
你可以使用NumPy的数组操作函数以更有效的方式实现这一点。一种方法是使用
np.concatenate()
函数水平连接数组,然后重新调整连接数组的形状,将每两行组成一个块。下面是你的操作方法:输出:
在这段代码中,首先使用
arr.reshape(-1, 2, arr.shape[1])
将输入数组arr
重新整形为两行的块。然后,使用切片语法chunks[0::2]
和chunks[1::2]
水平连接每隔一个块以选择备用块,然后使用np.concatenate()
沿着列轴(axis=2)
连接它们。最后,我们使用result.reshape(-1, arr.shape[1]*2)
将串接数组重新整形为两行的块。mzsu5hc05#
晚安@dmn,我得到了你的代码,并把它放到机器上运行。如果一个问题没有循环处理,根据你的例子,如果通过追加第一列,最快的方法将是concatenate
细胞:
输出:
细胞:
输出:
细胞:
输出:
细胞:
输出:
i5desfxk6#
您可以通过在为数组指定最终形状之前交换每组四行的第二行和第三行来“就地”执行此操作:
为了证明这会组合适当的行,如果您从以下内容开始:
您将获得: