Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy中的选择行和矩阵_Python_Numpy - Fatal编程技术网

Python numpy中的选择行和矩阵

Python numpy中的选择行和矩阵,python,numpy,Python,Numpy,是否有任何有效的numpy方法来执行以下操作: 假设我有一些matixM大小rxc。现在假设我有另一个矩阵 E其形状为rxa(其中a只是某个常量a

是否有任何有效的numpy方法来执行以下操作: 假设我有一些matix
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向我提出了关于辅助矩阵稀疏性的问题;-)