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

2024-09-25 12:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个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]]


Tags: 方法numpy元素np矩阵数组array成子
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]]) 

您可以使用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]])

相关问题 更多 >