从矩阵中提取列
我想知道怎么从一个矩阵中提取前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]])
这个代码块是一个占位符,里面可能包含一些编程代码或示例。具体内容没有给出,所以我们无法看到它的具体作用。