【问题标题】:Numpy : how to fill an array smartly?Numpy:如何巧妙地填充数组?
【发布时间】:2012-03-16 16:50:02
【问题描述】:

我想在 numpy 中创建一个 3D 数组,如下所示:

[ 0 1 0 1 0 1
  0 1 0 1 0 1
  0 1 0 1 0 1
  0 1 0 1 0 1
  0 1 0 1 0 1 ] ...

有什么好办法写吗?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    使用np.tile

    import numpy as np
    a = np.array([0, 1])
    my_tiled_array = np.tile(a, (3, 3))
    

    结果:

    array([[0, 1, 0, 1, 0, 1],
           [0, 1, 0, 1, 0, 1],
           [0, 1, 0, 1, 0, 1]])
    

    编辑:
    正如@DSM 在评论中建议的那样,如果你真的想要一个 3D 数组——我从你的代码示例中并不完全清楚——你可以使用:

    my_3d_tiled_arr = np.tile(a, (3, 3, 3))
    

    结果:

    array([[[0, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 0, 1]],
    
           [[0, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 0, 1]],
    
           [[0, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 0, 1],
            [0, 1, 0, 1, 0, 1]]])
    

    【讨论】:

    • 那不是二维数组吗? (这完全有可能——甚至可能——当然,这正是 OP 真正想要的。)
    • @DSM,感谢您的评论。我将添加另一个示例以(希望)涵盖所有基础。
    【解决方案2】:

    如果你想要一个一维数组(同样,不清楚你想要什么),你可以这样做:

    np.mod(np.arange(10),2)
    Out[4]: array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
    

    当然,如果需要,可以对其进行改造。但是,我认为伯尼的回答更好更清晰。

    【讨论】:

      【解决方案3】:

      @bernie 的方法很棒。实现相同目标的更快方法是(虚拟地)移动元素,而不是多次复制一对[0, 1]。您可以执行以下操作:

      import numpy as np
      A1 = np.concatenate([np.zeros(108), np.ones(108)]).reshape((2,108))
      A2 = A1.transpose()
      A3 = A2.reshape((6,6,6))
      

      第一行初始化一堆 0 和 1 并将它们打包到一个 2x108 数组中。第二行几乎没有进入108x2 数组。然后,最后一行对数组进行重新切片,使其为6x6x6,看起来就像您要查找的内容。

      唯一需要注意的是元素的数量。假设您想要一个6x6x6 的最终 3D 数组,就像在我的示例中一样,您将所有轴的长度相乘(得到 216),然后除以 2(= 108)。该数字是 1 和 0 的个数,也是 .reshape((2, n)) 函数调用中使用的数字。

      之所以如此之快,是因为初始化 0 或 1 的向量非常快,比复制任意数组更快。然后,移动元素,就像 .transpose().reshape() 所做的那样,几乎不会改变引用元素的方式,而不是移动内存中的元素本身。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-16
        • 2021-06-24
        • 2018-10-23
        • 2018-05-07
        • 2018-09-18
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多