Python numpy中的选择行和矩阵
是否有任何有效的numpy方法来执行以下操作: 假设我有一些matixPython numpy中的选择行和矩阵,python,numpy,Python,Numpy,是否有任何有效的numpy方法来执行以下操作: 假设我有一些matixM大小rxc。现在假设我有另一个矩阵 E其形状为rxa(其中a只是某个常量a
M
大小rxc
。现在假设我有另一个矩阵
E
其形状为rxa
(其中a
只是某个常量a
),其中包含
M
(和-1表示填充,即e
的每个元素都位于{-1,0,…,R-1}
)。比如说,
M=array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
E = array([[ 0, 1],
[ 2, -1],
[-1, 0]])
现在,给定这些矩阵,我想生成第三个矩阵p
,其中第I行p
将
包含以下M
行的总和:E[i,:]
。在本例中,P
将是
P[0,:] = M[0,:] + M[1,:]
P[1,:] = M[2,:]
P[2,:] = M[0,:]
是的,做一个循环是非常直接和简单的,我想知道是否有
任何让它更高效的新奇方法(假设我想用大矩阵,
e、 例如,200x200
谢谢!您可以使用
E
索引M
,其中E
中的实际索引大于或等于0
。为此,我们有where
参数:
np.sum(M[E], where=(E>=0)[...,None], axis=1)
array([[5, 7, 9],
[7, 8, 9],
[1, 2, 3]])
我们有:
M[E]
array([[[1, 2, 3],
[4, 5, 6]],
[[7, 8, 9],
[7, 8, 9]],
[[7, 8, 9],
[1, 2, 3]]])
在行上添加了:
(E>=0)[...,None]
array([[[ True],
[ True]],
[[ True],
[False]],
[[False],
[ True]]])
一种方法是对原始数组进行索引求和,然后通过
-1s
-
out = M[E].sum(1) - M[-1]*(E==-1).sum(1)[:,None]
另一种方法是在M
的末尾填充零,这样那些-1
将索引到这些零中,因此对索引后的最终和没有影响-
M1 = np.vstack((M, np.zeros((1,M.shape[1]), dtype=M.dtype)))
out = M1[E].sum(1)
如果E
中每行只有一个或更少的-1
,我们可以进一步优化-
out = M[E].sum(1)
m = (E==-1).any(1)
out[m] -= M[-1]
另一种是基于张量乘法的-
np.einsum('ij,kli->kj',M, (E[...,None]==np.arange(M.shape[1])))
可能不是最快的,但可能是有教育意义的:您描述的操作可以被认为是与某个邻接矩阵的矩阵乘法:
from scipy import sparse
# construct adjacency matrix
indices = E[E!=-1]
indptr = np.concatenate([[0],np.count_nonzero(E!=-1,axis=1).cumsum()])
data = np.ones_like(indptr)
aux = sparse.csr_matrix((data,indices,indptr))
# multiply
aux*M
# array([[5, 7, 9],
# [7, 8, 9],
# [1, 2, 3]], dtype=int64)
在
E
中,每行可以有2个或更多的-1
?受这个矩阵乘法的启发,我开始思考,最后得到了一个张量乘法。@DIvakar you one向我提出了关于辅助矩阵稀疏性的问题;-)