向量、矩阵乘法和求和
vector, matrix multiplication and sum
我在 numpy
/scipy
中的所有选项中兜圈子。点积、乘法、matmul、tensordot、einsum 等
我想将一个一维向量与一个二维矩阵(这将是稀疏的 csr)相乘并对结果求和,所以我有一个一维向量
例如
oneDarray = np.array([1, 2, 3])
matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
# multiple and sum the oneDarray against the rows of the matrix
# eg 1*1 + 1*2 + 1*3 = 6, 2*4 + 2*5 + 2*6 = 30, 3*7 + 3*8 + 3*9 = 42
so output we be [6,30,53]
# multiple and sum the oneDarray against the columns of the matrix
# eg 1*1 + 1*4 + 1*7 = 28, 2*2 + 2*5 + 2*8 = 30, 3*3 + 3*6 + 3*9 = 486
so output we be [28,30,486]
如有任何帮助,我们将不胜感激。
嗯,你的 question.The 中有一些计算错误,第一部分将导致 [6, 30, 72]
,第二部分将导致 [12, 30, 54]
。如果我理解正确,第一个可以用
解决
np.sum(oneDarray * matrix.T, axis=0)
第二部分
np.sum(np.multiply(matrix, oneDarray), axis=0)
# 1*1 + 1*2 + 1*3 = 6, 2*4 + 2*5 + 2*6 = 30, 3*7 + 3*8 + 3*9 = 42
1*1 + 1*2 + 1*3 = 6
2*4 + 2*5 + 2*6 = 30,
3*7 + 3*8 + 3*9 = 42
1*(1 + 2 + 3) = 6,
2*(4 + 5 + 6) = 30,
3*(7 + 8 + 9) = 42
所以这可以通过几种方式计算:
In [92]: oneDarray*(matrix.sum(axis=1))
Out[92]: array([ 6, 30, 72])
In [93]: np.einsum('i,ij->i', oneDarray, matrix)
Out[93]: array([ 6, 30, 72])
In [94]: (oneDarray[:,None]*matrix).sum(axis=1)
Out[94]: array([ 6, 30, 72])
它不适合通常的 dot
(矩阵)产品,它有一个 einsum
表达式,如 ij,j->i
(求和错误的索引)。
另一种表达是(你的值是错误的,除了中间那个):
In [95]: matrix.sum(axis=0)*oneDarray
Out[95]: array([12, 30, 54])
如果矩阵是稀疏的csr:
In [96]: M = sparse.csr_matrix(matrix)
In [97]: M
Out[97]:
<3x3 sparse matrix of type '<class 'numpy.int64'>'
with 9 stored elements in Compressed Sparse Row format>
In [98]: M.sum(axis=1)
Out[98]:
matrix([[ 6],
[15],
[24]])
In [99]: M.sum(axis=1).A1*oneDarray
Out[99]: array([ 6, 30, 72])
sum
是一个(3,1)np.matrix
。 A1
将其展平为 1d ndarray
,使元素乘法更容易。
In [103]: M.sum(axis=0)
Out[103]: matrix([[12, 15, 18]], dtype=int64)
In [104]: M.sum(axis=0).A1*oneDarray
Out[104]: array([12, 30, 54], dtype=int64)
In [116]: np.multiply(M.sum(0), oneDarray)
Out[116]: matrix([[12, 30, 54]], dtype=int64)
我在 numpy
/scipy
中的所有选项中兜圈子。点积、乘法、matmul、tensordot、einsum 等
我想将一个一维向量与一个二维矩阵(这将是稀疏的 csr)相乘并对结果求和,所以我有一个一维向量
例如
oneDarray = np.array([1, 2, 3])
matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
# multiple and sum the oneDarray against the rows of the matrix
# eg 1*1 + 1*2 + 1*3 = 6, 2*4 + 2*5 + 2*6 = 30, 3*7 + 3*8 + 3*9 = 42
so output we be [6,30,53]
# multiple and sum the oneDarray against the columns of the matrix
# eg 1*1 + 1*4 + 1*7 = 28, 2*2 + 2*5 + 2*8 = 30, 3*3 + 3*6 + 3*9 = 486
so output we be [28,30,486]
如有任何帮助,我们将不胜感激。
嗯,你的 question.The 中有一些计算错误,第一部分将导致 [6, 30, 72]
,第二部分将导致 [12, 30, 54]
。如果我理解正确,第一个可以用
np.sum(oneDarray * matrix.T, axis=0)
第二部分
np.sum(np.multiply(matrix, oneDarray), axis=0)
# 1*1 + 1*2 + 1*3 = 6, 2*4 + 2*5 + 2*6 = 30, 3*7 + 3*8 + 3*9 = 42
1*1 + 1*2 + 1*3 = 6
2*4 + 2*5 + 2*6 = 30,
3*7 + 3*8 + 3*9 = 42
1*(1 + 2 + 3) = 6,
2*(4 + 5 + 6) = 30,
3*(7 + 8 + 9) = 42
所以这可以通过几种方式计算:
In [92]: oneDarray*(matrix.sum(axis=1))
Out[92]: array([ 6, 30, 72])
In [93]: np.einsum('i,ij->i', oneDarray, matrix)
Out[93]: array([ 6, 30, 72])
In [94]: (oneDarray[:,None]*matrix).sum(axis=1)
Out[94]: array([ 6, 30, 72])
它不适合通常的 dot
(矩阵)产品,它有一个 einsum
表达式,如 ij,j->i
(求和错误的索引)。
另一种表达是(你的值是错误的,除了中间那个):
In [95]: matrix.sum(axis=0)*oneDarray
Out[95]: array([12, 30, 54])
如果矩阵是稀疏的csr:
In [96]: M = sparse.csr_matrix(matrix)
In [97]: M
Out[97]:
<3x3 sparse matrix of type '<class 'numpy.int64'>'
with 9 stored elements in Compressed Sparse Row format>
In [98]: M.sum(axis=1)
Out[98]:
matrix([[ 6],
[15],
[24]])
In [99]: M.sum(axis=1).A1*oneDarray
Out[99]: array([ 6, 30, 72])
sum
是一个(3,1)np.matrix
。 A1
将其展平为 1d ndarray
,使元素乘法更容易。
In [103]: M.sum(axis=0)
Out[103]: matrix([[12, 15, 18]], dtype=int64)
In [104]: M.sum(axis=0).A1*oneDarray
Out[104]: array([12, 30, 54], dtype=int64)
In [116]: np.multiply(M.sum(0), oneDarray)
Out[116]: matrix([[12, 30, 54]], dtype=int64)