【问题标题】:numpy optimize way(remove loops)numpy 优化方式(删除循环)
【发布时间】:2018-05-03 12:41:01
【问题描述】:

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

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

【问题讨论】:

    标签: python numpy optimization


    【解决方案1】:

    您可以使用 np.transpose 置换轴,然后重塑为 2D -

    y = x.transpose(1,2,0).reshape(-1,x.shape[0])
    

    附加.tolist() 用于列表输出。

    【讨论】:

    【解决方案2】:

    是的,要么使用np.reshape(x, shape),要么尝试使用np.ndarray.flatten(x, order='F')(F 代表 Fortran 样式,列在前,根据您的示例)。

    阅读documentation,找出最适合的参数。恕我直言,我认为ndarray.flatten 对您来说是更好、更优雅的选择。但是,根据您确切想要的解决方案,您可能必须先重塑数组。

    【讨论】:

      猜你喜欢
      • 2016-10-25
      • 2021-12-20
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2011-11-03
      • 1970-01-01
      相关资源
      最近更新 更多