情况 | A*B | np.dot(A,B) | np.multiply(A,B) |
---|---|---|---|
A.shape=(1,m) ;B.shape=(1,1) | C.shape = (1,m) A行向量扩大b倍 | ValueError | 同 * 运算法则 |
A.shape=(1,m) ;B.shape=(1,n) | C.shape = (1,m) 相同坐标的元素相乘。注:当且仅当n=m成立 | ValueError | 同 * 运算法则 |
A.shape=(1,m) ;B.shape=(n,1) | C.shape = (n,m) 行向量扩大bi(i=1-n)倍,结果独占一行 | C.shape = (1,1) 向量点乘法则。注:当且仅当n=m成立 | 同 * 运算法则 |
A.shape=(n,m) ;B.shape=(l,o) | C.shape = (n,m) 相同坐标的元素相乘。注:当且仅当m=o时成立 | C.shape = (n,o) 相同坐标的元素相乘。注:当且仅当m=l成立 | 同 * 运算法则 |
总结:
np.dot(a,b)
遵循矩阵向量运算规则
np.multiply(A,B)
和 A*B
两者遵循相同的运算规则,更偏向于列向量相同矩阵向量相乘。(也就适用于机器学习列向量代表样本数量)
附上 写笔记用的测试代码
import numpy as np
# 行向量、数
# a = np.array([[1, 2, 3]])
# b = np.array([[2]])
# 行向量、行向量
# a = np.array([[1, 2, 3]])
# b = np.array([[2, 2, 3]])
# b = np.array([[2, 2]])
# 行向量、列向量
# a = np.array([[1, 2, 3]])
# # b = np.array([[2],[ 2],[3]])
# b = np.array([[2], [2]])
# 矩阵、矩阵
# a = np.array([[1, 2,1], [3, 4,1]])
# b = np.array([[2, 2, 1], [1, 1,1]])
a = np.array([[1, 2,1], [3, 4,1]])
b = np.array([[2, 2, 1]])
# a = np.array([[1, 2], [3, 4]])
# b = np.array([[2, 2], [1, 1]])
# a = np.array([[1, 2], [3, 4], [1, 1]])
# b = np.array([[2], [2]])
print(a * b)
# print(np.dot(a, b))
print(np.multiply(a,b))