如何将numpy矩阵的元素扩展为子矩阵

时间:2019-03-25 16:03:17

标签: python arrays numpy

假设我有一个numpy数组:

x = np.array([[1, 2],
              [3, 4]]

将元素扩展为子矩阵的最简单方法是什么? 中间结果可能像这样:

x = np.array([[[[1, 1],[1, 1]], [[2, 2],[2, 2]]],
              [[[3, 3],[3, 3]], [[4, 4],[4, 4]]]]

以及所需的结果:

x = np.array([[1, 1, 2, 2],
              [1, 1, 2, 2],
              [3, 3, 4, 4],
              [3, 3, 4, 4]]

2 个答案:

答案 0 :(得分:2)

您可以在所需的轴上使用两个repeat

In [34]: np.repeat(np.repeat(x, 2, 1), 2, 0)
Out[34]: 
array([[1, 1, 2, 2],
       [1, 1, 2, 2],
       [3, 3, 4, 4],
       [3, 3, 4, 4]])

或者作为一种更快的方法(更适合于较大的数组和重复数字),您可以使用as_strided

In [43]: from numpy.lib.stride_tricks import as_strided

In [44]: x, y = arr.shape

In [45]: xs, ys = arr.strides

In [46]: result = as_strided(arr, (x, 2, y, 2), (xs, 0, ys, 0))

In [47]: result.reshape(x*2, y*2)
Out[47]: 
array([[1, 1, 2, 2],
       [1, 1, 2, 2],
       [3, 3, 4, 4],
       [3, 3, 4, 4]]) 

答案 1 :(得分:1)

您可以使用numpy.repeat来完成任务。它有一个axis参数。

>>> a = np.array([[1, 2], [3, 4]])
>>> a
array([[1, 2],
       [3, 4]])

>>> np.repeat(a, 2)
array([1, 1, 2, 2, 3, 3, 4, 4])

>>> np.repeat(a, 2, axis=1)
array([[1, 1, 2, 2],
       [3, 3, 4, 4]])

>>> np.repeat(np.repeat(a, 2, axis=1), 2, axis=0)
array([[1, 1, 1, 1],
       [2, 2, 2, 2],
       [3, 3, 3, 3],
       [4, 4, 4, 4]])