numpy';s等价于MATLAB';s(矢量化)sub2ind(…,I,J)

numpy';s等价于MATLAB';s(矢量化)sub2ind(…,I,J),numpy,indexing,Numpy,Indexing,假设I和J都是列向量(比如长度K),因此对于有效索引K,I和J的第K个条目表示一些N×N矩阵MAT中的行和列坐标 使用MATLAB,要使用与I和J指定的位置对应的坐标分配到MAT中的位置,可以编写: MAT(sub2ind([N N], I, J)) = X; …其中X是长度为K的向量 有了numpy,我能想出的最好办法就是 MAT.flat[[np.ravel_multi_index((I[k], J[k]), (N, N)) for k in range(K)]] = X 有没有更“口语

假设
I
J
都是列向量(比如长度K),因此对于有效索引K,
I
J
的第K个条目表示一些N×N矩阵
MAT
中的行和列坐标

使用MATLAB,要使用与
I
J
指定的位置对应的坐标分配到
MAT
中的位置,可以编写:

MAT(sub2ind([N N], I, J)) = X;
…其中
X
是长度为K的向量

有了numpy,我能想出的最好办法就是

MAT.flat[[np.ravel_multi_index((I[k], J[k]), (N, N)) for k in range(K)]] = X

有没有更“口语化的numpy”的方法呢?

这比使用numpy要容易得多

i = I.ravel()
j = J.ravel()
MAT[i,j] = X
我使用
ravel
方法将列转换为一维数组。另一种选择是

MAT[I.flat, J.flat] = X
我不能在看不到完整上下文的情况下确定,但我怀疑您可以修改创建
I
J
的代码,使它们成为一维数组(即使用shape
(K,)
),而不是使用shape
(K,1)
的列。如果你那样做了,你就可以写了

MAT[I,J] = X

这比使用numpy要容易得多

i = I.ravel()
j = J.ravel()
MAT[i,j] = X
我使用
ravel
方法将列转换为一维数组。另一种选择是

MAT[I.flat, J.flat] = X
我不能在看不到完整上下文的情况下确定,但我怀疑您可以修改创建
I
J
的代码,使它们成为一维数组(即使用shape
(K,)
),而不是使用shape
(K,1)
的列。如果你那样做了,你就可以写了

MAT[I,J] = X