我需要获得矩阵的对角条纹(这里不确定术语,对角矩阵条纹似乎最好描述它) .
比方说,我有一个大小为KxN的矩阵,其中K和N是任意大小,K> N.说,我有一个矩阵:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
从中我需要提取对角条纹,在这种情况下,是通过截断原始条带创建的矩阵MxV大小:
[[ 0 x x]
[ 3 4 x]
[ x 7 8]
[ x x 11]]
所以结果矩阵是:
[[ 0 4 8]
[ 3 7 11]]
下面是一个使用矩阵屏蔽的小示例代码,用于去除屏蔽位置:
import numpy as np
X=np.arange(12).reshape(4,3)
mask=np.asarray([
[ True, False, False],
[ True, True, False],
[ False, True, True],
[ False, False, True]
])
>>> mask
array([[ True, False, False],
[ True, True, False],
[False, True, True],
[False, False, True]], dtype=bool)
>>> X
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> X.T[mask.T].reshape(3,2).T
array([[ 0, 4, 8],
[ 3, 7, 11]])
但我不知道如何将这种面具自动生成任何K和N尺寸,例如 . 39x9或360x96
任何帮助表示赞赏 . 也许有一些函数可以在numpy,scipy或pytorch中自动执行此操作?
编辑:
我有另一个问题,是否有可能而不是得到:
[[ 0 x x]
[ 3 4 x]
[ x 7 8]
[ x x 11]]
要得到这样的反向条纹:
[[ x x 2]
[ x 4 5]
[ 6 7 x]
[ 9 x x]]
2 回答
stride_tricks
诀窍:如果
a
是一个数组,则会创建一个可写视图,这意味着如果你有这种倾向,你可以做类似的事情更新:可以以同样的精神获得从左下到右上的条纹 . 只有轻微的复杂性:它不是基于与原始数组相同的地址 .
延伸保罗的答案 . 您可以在PyTorch中使用diag多次执行相同的操作(我不认为在PyTorch中有任何直接的功能可以做大步)