numpy优化方式(删除循环)

时间:2017-11-20 10:13:01

标签: python numpy optimization

我想在非常庞大的数组上使用此代码。这段代码需要很长时间才能执行,效率不高。 有没有办法删除循环并将此代码转换为最佳方式?

>>> 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]]

2 个答案:

答案 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对你来说是更好,更优雅的选择。但是,根据您确切需要的解决方案,您可能必须首先重塑阵列。

相关问题