我想在非常庞大的数组上使用此代码。这段代码需要很长时间才能执行,效率不高。 有没有办法删除循环并将此代码转换为最佳方式?
>>> import numpy as np
>>> x=np.random.randint(10, size=(4,5,3))
>>> x
array([[[3, 2, 6],
[4, 6, 6],
[3, 7, 9],
[6, 4, 2],
[9, 0, 1]],
[[9, 0, 4],
[1, 8, 9],
[6, 8, 1],
[9, 4, 5],
[1, 5, 2]],
[[6, 1, 6],
[1, 8, 8],
[3, 8, 3],
[7, 1, 0],
[7, 7, 0]],
[[5, 6, 6],
[8, 3, 1],
[0, 5, 4],
[6, 1, 2],
[5, 6, 1]]])
>>> y=[]
>>> for i in range(x.shape[1]):
for j in range(x.shape[2]):
y.append(x[:, i, j].tolist())
>>> y
[[3, 9, 6, 5], [2, 0, 1, 6], [6, 4, 6, 6], [4, 1, 1, 8], [6, 8, 8, 3], [6, 9, 8, 1], [3, 6, 3, 0], [7, 8, 8, 5], [9, 1, 3, 4], [6, 9, 7, 6], [4, 4, 1, 1], [2, 5, 0, 2], [9, 1, 7, 5], [0, 5, 7, 6], [1, 2, 0, 1]]
答案 0 :(得分:2)
您可以使用np.transpose
置换轴,然后重新转换为2D
-
y = x.transpose(1,2,0).reshape(-1,x.shape[0])
附加.tolist()
列表输出。
答案 1 :(得分:2)
是的,要么使用np.reshape(x, shape)
,要么使用np.ndarray.flatten(x, order='F')
(根据您的示例,使用F代表Fortran样式,列第一列)。
阅读documentation以找出最适合的参数。恕我直言,我认为ndarray.flatten
对你来说是更好,更优雅的选择。但是,根据您确切需要的解决方案,您可能必须首先重塑阵列。