【问题标题】:Difference between NumPy.dot() and ‘*’ in PythonPython 中 NumPy.dot() 和 ‘*’ 的区别
【发布时间】:2021-05-02 14:52:27
【问题描述】:

通常:a * b == np.multiply(a, b) 但在这种情况下:

a=np.matrix(([1,2,3],[1,2,3],[1,2,3]))
b = np.array(([1,2,3]))
print( a.dot(b))
print(np.multiply(a,b))
print(a * b)

我有一个问题:

[[14 14 14]]
[[1 4 9]
 [1 4 9]
 [1 4 9]]
Traceback (most recent call last):
  File "C:\Users\FAROUQ\.spyder-py3\untitled0.py", line 28, in <module>
    print(a * b)
ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

请你解释一下为什么?

【问题讨论】:

  • * 是 np.matrix 的矩阵乘法运算符,a 是矩阵,而不是数组。当您调用 a.__mul__ 时,它确实是点积。将 a 更改为一个数组,它的行为将符合您的预期。

标签: python numpy matrix


【解决方案1】:

np.dot() 乘积是向量/矩阵的点积标度积。如果您不知道什么是点积,我建议您了解一下。 (线性代数/微积分)。 代数上,点积是两个数列对应项的乘积之和。

例如:

a = [3, 2, 4]
b = [5, 7, 6]
np.dot(a, b) = 3 * 5 + 5 * 7 + 4 * 6 = 15 + 14 + 24 = 53

* 在 NumPy 中是两个数组的element-wise乘积。

例如:

a = np.array([3, 2, 4])
b = np.array([5, 7, 6])
a * b = [3 * 5, 2 * 7, 4 * 6] = [15, 14, 24]

【讨论】:

  • 谢谢,但为什么我有这个问题:print(a * b) 通常,我应该有这个结果:[[1 4 9] [1 4 9] [1 4 9]]
  • 结果应该是这样的,但只有当您使用 np.array() 将这些列表转换为 NumPy 数组时才有效
【解决方案2】:

你应该用 np.array 替换 np.matrix 以获得相同的结果!

a = np.array(([1,2,3],[1,2,3],[1,2,3]))
b = np.array(([1,2,3]))
print( a.dot(b))
print(np.multiply(a,b))
print(a * b)

附加信息

1.元素乘积a*b元素矩阵乘法 np.multiply(a,b) 都是一样的!

2。点积 : np.dot(a,b) or a.dot(b)

示例:

【讨论】:

  • 我们可以这样说吗? ``` with Matrix => dot(A,B) == AB => multiply(A,B) != AB with Arrays => dot(A,B) != AB => 乘(A,B) == AB ```
  • 我们可以说? ``` 如果 A 是矩阵且 B 是矩阵:dot(A,B) == AB and multiply(A,B) != AB elif A 是 Array 而 B 是 Array:dot(A,B) != AB and multiply(A,B) == AB elif(A 是矩阵,B 是数组)或(A 是数组,B 是矩阵):dot(A,B) == AB and multiply(A,B) != AB ` ``
  • 是的,我认为您的结论是正确的,因为使用 np.array 的元素排列与 np.matrix 不同,并且因为方法 np.multiply 无法正常工作
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 2016-05-25
  • 2021-09-30
  • 2011-10-25
  • 2019-03-26
  • 2011-09-23
  • 2013-01-17
  • 2011-07-12
相关资源
最近更新 更多