有一种用Matlab
编写的方法,我想将其转换为Python
。但是,我不理解如何解释用矩阵M
的一行索引稀疏矩阵faces
的表示法。 Python
中的等价物是什么?
M = spalloc(size(template,1), size(template,1), 10*size(template,1));
for i = 1:size(faces,1)
v = faces(i,:); % faces is a Nx3 matrix
...
M(v, v) = M(v, v) + WIJ; % WIJ is some 3x3 matrix
答案 0 :(得分:2)
import numpy as np
A=[[1,2,3],[3,4,5],[5,6,7]]
M=np.array(A)
v=[0,1]
M[v][:,v]
结果是:
array([[1, 2],
[3, 4]])
答案 1 :(得分:2)
@Eric Yu`使用密集的numpy数组:
In [239]: A=np.array([[1,2,3],[3,4,5],[5,6,7]])
In [240]: A
Out[240]:
array([[1, 2, 3],
[3, 4, 5],
[5, 6, 7]])
In [241]: v=[0,1]
此索引选择行:
In [242]: A[v]
Out[242]:
array([[1, 2, 3],
[3, 4, 5]])
,然后从选择的列中进行
:In [243]: A[v][:,v]
Out[243]:
array([[1, 2],
[3, 4]])
但是A[v]
是副本,而不是视图,因此分配将失败:
In [244]: A[v][:,v] = 0
In [245]: A
Out[245]:
array([[1, 2, 3],
[3, 4, 5],
[5, 6, 7]])
===
要正确索引一个numpy数组的块,请使用ix_
(或等效项)来创建索引数组,它们相互广播以定义该块:
In [247]: np.ix_(v,v)
Out[247]:
(array([[0],
[1]]), array([[0, 1]]))
In [248]: A[np.ix_(v,v)]
Out[248]:
array([[1, 2],
[3, 4]])
In [249]: A[np.ix_(v,v)]=0
In [250]: A
Out[250]:
array([[0, 0, 3],
[0, 0, 5],
[5, 6, 7]])
在没有ix_
变换的情况下,使用[v,v]
进行索引会选择对角线:
In [251]: A[v,v]
Out[251]: array([0, 0])
MATLAB M(v,v)
对块进行索引。另一方面,索引对角线需要使用sub2idx
(或类似的东西)。在这种情况下,MATLAB的索引符号使一项任务变得容易,而另一项任务变得更加复杂。 numpy
则相反。
===
我写的内容也适用于稀疏矩阵
In [253]: M=sparse.lil_matrix(np.array([[1,2,3],[3,4,5],[5,6,7]]))
In [254]: M
Out[254]:
<3x3 sparse matrix of type '<class 'numpy.int64'>'
with 9 stored elements in LInked List format>
对角线选择:
In [255]: M[v,v]
Out[255]:
<1x2 sparse matrix of type '<class 'numpy.int64'>'
with 2 stored elements in LInked List format>
In [256]: _.A
Out[256]: array([[1, 4]], dtype=int64)
请注意,按照MATLAB矩阵的样式,此矩阵为(1,2),仍为2d。
块选择:
In [258]: M[np.ix_(v,v)]
Out[258]:
<2x2 sparse matrix of type '<class 'numpy.int64'>'
with 4 stored elements in LInked List format>
In [259]: _.A
Out[259]:
array([[1, 2],
[3, 4]], dtype=int64)
In [260]: M[np.ix_(v,v)]=0
In [261]: M.A
Out[261]:
array([[0, 0, 3],
[0, 0, 5],
[5, 6, 7]], dtype=int64)
sparse.csr_matrix
将以相同的方式编制索引(分配步骤有所不同)。