gpt4 book ai didi

python - 折叠除前两个之外的 numpy 数组的所有维度

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:45 25 4
gpt4 key购买 nike

我有一个可变维度的 numpy 数组,例如它可以有以下形状

(64, 64)
(64, 64, 2, 5)
(64, 64, 40)
(64, 64, 10, 20, 4)

我想做的是,如果维数大于 3,我想在保持顺序的同时将其他所有内容折叠/堆叠到三维中。所以,在我上面的例子中,操作后的形状应该是:

(64, 64)
(64, 64, 10)
(64, 64, 40)
(64, 64, 800)

此外,需要保留顺序。例如,形状为 (64, 64, 2, 5) 的数组应该堆叠为

(64, 64, 2)
(64, 64, 2)
(64, 64, 2)
(64, 64, 2)
(64, 64, 2)

即3D切片一个接一个。此外,在操作后我想将它 reshape 回原始形状而不进行任何排列,即保留原始顺序。

我可以做的一种方法是将所有维度值从 3 乘以最后一个维度,即

shape = array.shape
if len(shape) > 3:
final_dim = 1
for i in range(2, len(shape)):
final_dim *= shape[i]

然后 reshape 数组。像这样的东西:

array.reshape(64, 64, final_dim)

但是,我首先不确定顺序是否按照我的意愿保留,以及是否有更好的 pythonic 方法来实现这一点?

最佳答案

编辑:正如其他答案中所指出的,仅提供 -1 作为 reshape 的第三维更为容易。然后 Numpy 会自动确定正确的形状。

我不确定这里的问题是什么。您可以只使用 np.reshape 并保留顺序。见以下代码:

import numpy as np

A = np.random.rand(20,20,2,2,18,5)
print A.shape

new_dim = np.prod(A.shape[2:])
print new_dim
B = np.reshape(A, (A.shape[0], A.shape[1], np.prod(A.shape[2:])))
print B.shape

C = B.reshape((20,20,2,2,18,5))
print np.array_equal(A,C)

输出是:

(20L, 20L, 2L, 2L, 18L, 5L)
360
(20L, 20L, 360L)
True

这完全符合您的要求。

关于python - 折叠除前两个之外的 numpy 数组的所有维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41795638/

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