我有一个矩阵A和一个索引列表,比如l = [0,3,4,5]
。有没有一种简单的方法可以访问对应于那些行和列的A的4x4子矩阵,即A[l,l]
? A[l,:]
访问l中行的所有列,A[l,1:4]
访问l
中的行和A
的前四列,但我无法找到访问l
的方法1}}以这种方式的列和行索引。
目的是我想为一些4x1向量G = np.eye(4) - A[l,l]
定义一个新矩阵,例如v = A[l,l]*c
或新向量c
,而不移动/复制存储在A中的数据。
答案 0 :(得分:1)
IIUC,您可以使用np.ix_
:
>>> A = np.arange(100).reshape(10,10)
>>> L = [0,3,4,5]
>>> np.ix_(L, L)
(array([[0],
[3],
[4],
[5]]), array([[0, 3, 4, 5]]))
>>> A[np.ix_(L, L)]
array([[ 0, 3, 4, 5],
[30, 33, 34, 35],
[40, 43, 44, 45],
[50, 53, 54, 55]])
这也可用于索引以进行修改:
>>> A[np.ix_(L, L)] *= 10
>>> A[np.ix_(L, L)]
array([[ 0, 30, 40, 50],
[300, 330, 340, 350],
[400, 430, 440, 450],
[500, 530, 540, 550]])
当然,如果您愿意,您可以随时手动构建由ix_
返回的数组:
>>> Larr = np.array(L)
>>> Larr[:,None]
array([[0],
[3],
[4],
[5]])
>>> Larr[None, :]
array([[0, 3, 4, 5]])
答案 1 :(得分:1)
如果你正在使用numpy(你应该),你可以这样做
import numpy as np
m=np.reshape(range(36),(6,6))
ix=(0,3,4,5)
m[ix,:][:,ix]
array([[ 0, 3, 4, 5],
[18, 21, 22, 23],
[24, 27, 28, 29],
[30, 33, 34, 35]])