在两个轴上重复数组的值

Wil*_*dan 15 python arrays numpy

假设我有这个数组:

array = np.array([[1,2,3],[4,5,6],[7,8,9]])
Run Code Online (Sandbox Code Playgroud)

返回:

123
456
789
Run Code Online (Sandbox Code Playgroud)

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

111222333
111222333
111222333
444555666
444555666
444555666
777888999
777888999
777888999
Run Code Online (Sandbox Code Playgroud)

Ch3*_*teR 17

你必须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]]
Run Code Online (Sandbox Code Playgroud)


moz*_*way 9

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

np.einsum('ij,ikjl->ikjl', array, np.ones((3,3,3,3))).reshape(9,9)
Run Code Online (Sandbox Code Playgroud)

通用方法是:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

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]])
Run Code Online (Sandbox Code Playgroud)

然而,这种方法的优点在于,可以很容易地更改顺序以获得其他模式或处理更高的维度。

其他模式的示例:

>>> 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]])
Run Code Online (Sandbox Code Playgroud)