从矩阵中提取列

2 投票
2 回答
6433 浏览
提问于 2025-04-17 10:15

我想知道怎么从一个矩阵中提取前n列,或者说怎么从第5列提取到第5+n列。

我的情况是,我有一个矩阵,大小是(i,j),然后我想查看连续的n列块。

所以我想先看从第0列到第n列,然后再看从第1列到第n+1列,依此类推。

直到我到达矩阵的末尾。

谢谢

>>> mat=array(range(0,20)).reshape(2,10)
>>> mat
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

假设n=8。

我想提取前8列。

然后是从第[1,11]列到第[8,18]列的矩阵。

接着是从第[2,12]列到第[9,19]列的矩阵。

2 个回答

3

在Sven Marnach的回答基础上,如果你想对mat[:,0:8]进行计算,然后再对mat[:,1:9]进行计算,依此类推,其实你可以在一个三维矩阵上一次性完成所有的计算。

In [119]: x = np.lib.stride_tricks.as_strided(mat, shape = (3,2,8), strides = mat.itemsize*np.array([1,mat.shape[-1],1]))

In [120]: x
Out[120]: 
array([[[ 0,  1,  2,  3,  4,  5,  6,  7],
        [10, 11, 12, 13, 14, 15, 16, 17]],

       [[ 1,  2,  3,  4,  5,  6,  7,  8],
        [11, 12, 13, 14, 15, 16, 17, 18]],

       [[ 2,  3,  4,  5,  6,  7,  8,  9],
        [12, 13, 14, 15, 16, 17, 18, 19]]])

比如说,如果你想计算行之间的内积,你可以用下面的方式一次性计算出所有的结果:

In [127]: np.sum(x[:,0,:]*x[:,1,:],axis = -1)
Out[127]: array([420, 564, 724])

而不是使用Python的循环来一个个计算:

In [128]: for i in range(3):
   .....:     print(np.sum(mat[0,i:i+8]*mat[1,i:i+8]))
   .....:     
   .....:     
420
564
724
4
>>> mat[:, 0:8]
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [10, 11, 12, 13, 14, 15, 16, 17]])
>>> mat[:, 1:9]
array([[ 1,  2,  3,  4,  5,  6,  7,  8],
       [11, 12, 13, 14, 15, 16, 17, 18]])

这个代码块是一个占位符,里面可能包含一些编程代码或示例。具体内容没有给出,所以我们无法看到它的具体作用。

撰写回答