【问题标题】:Repeat values of an array on both the axes在两个轴上重复数组的值
【发布时间】:2022-01-09 16:08:55
【问题描述】:

假设我有这个数组:

array = np.array([[1,2,3],[4,5,6],[7,8,9]])

返回:

123
456
789

我应该如何让它返回这样的东西?

111222333
111222333
111222333
444555666
444555666
444555666
777888999
777888999
777888999

【问题讨论】:

  • @Denny 我使用 for 循环来实现这一点,但是它过于复杂而且我认为效率低下,将来我会在帖子中添加我的尝试。但是,我希望这个问题的答案对其他人有所帮助,因为由于双哔声所做的编辑,它既清晰又内容丰富。

标签: python arrays numpy


【解决方案1】:

您必须在这里使用两次np.repeat

np.repeat(np.repeat(array, 3, axis=1), 3, axis=0)

# [[1 1 1 2 2 2 3 3 3]
#  [1 1 1 2 2 2 3 3 3]
#  [1 1 1 2 2 2 3 3 3]
#  [4 4 4 5 5 5 6 6 6]
#  [4 4 4 5 5 5 6 6 6]
#  [4 4 4 5 5 5 6 6 6]
#  [7 7 7 8 8 8 9 9 9]
#  [7 7 7 8 8 8 9 9 9]
#  [7 7 7 8 8 8 9 9 9]]

【讨论】:

    【解决方案2】:

    为了好玩(因为嵌套的repeat 会更有效),您可以在输入数组上使用einsum 和具有额外维度的ones 数组来创建一个具有理想维度的多维数组order to reshape 到预期的 2D 形状:

    np.einsum('ij,ikjl->ikjl', array, np.ones((3,3,3,3))).reshape(9,9)
    

    通用方法是:

    i,j = array.shape
    k = 3 # extra rows
    l = 3 # extra cols
    np.einsum('ij,ikjl->ikjl', a, np.ones((i,k,j,l))).reshape(i*k,j*l)
    

    输出:

    array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
           [1, 1, 1, 2, 2, 2, 3, 3, 3],
           [1, 1, 1, 2, 2, 2, 3, 3, 3],
           [4, 4, 4, 5, 5, 5, 6, 6, 6],
           [4, 4, 4, 5, 5, 5, 6, 6, 6],
           [4, 4, 4, 5, 5, 5, 6, 6, 6],
           [7, 7, 7, 8, 8, 8, 9, 9, 9],
           [7, 7, 7, 8, 8, 8, 9, 9, 9],
           [7, 7, 7, 8, 8, 8, 9, 9, 9]])
    

    这种方法的好处在于,它很容易改变顺序以获得其他模式或使用更高的维度。

    其他模式的示例:

    >>> np.einsum('ij,iklj->iklj', a, np.ones((3,3,3,3))).reshape(9,9)
    array([[1, 2, 3, 1, 2, 3, 1, 2, 3],
           [1, 2, 3, 1, 2, 3, 1, 2, 3],
           [1, 2, 3, 1, 2, 3, 1, 2, 3],
           [4, 5, 6, 4, 5, 6, 4, 5, 6],
           [4, 5, 6, 4, 5, 6, 4, 5, 6],
           [4, 5, 6, 4, 5, 6, 4, 5, 6],
           [7, 8, 9, 7, 8, 9, 7, 8, 9],
           [7, 8, 9, 7, 8, 9, 7, 8, 9],
           [7, 8, 9, 7, 8, 9, 7, 8, 9]])
    
    >>> np.einsum('ij,kjil->kjil', a, np.ones((3,3,3,3))).reshape(9,9)
    array([[1, 1, 1, 4, 4, 4, 7, 7, 7],
           [2, 2, 2, 5, 5, 5, 8, 8, 8],
           [3, 3, 3, 6, 6, 6, 9, 9, 9],
           [1, 1, 1, 4, 4, 4, 7, 7, 7],
           [2, 2, 2, 5, 5, 5, 8, 8, 8],
           [3, 3, 3, 6, 6, 6, 9, 9, 9],
           [1, 1, 1, 4, 4, 4, 7, 7, 7],
           [2, 2, 2, 5, 5, 5, 8, 8, 8],
           [3, 3, 3, 6, 6, 6, 9, 9, 9]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多