Mar*_*cel 18 python arrays numpy
我试着理解如何处理1D
数组(线性代数中的向量)NumPy
.
在以下示例中,我生成两个numpy.array
a
并且b
:
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([[1],[2],[3]]).reshape(1,3)
>>> a.shape
(3,)
>>> b.shape
(1, 3)
Run Code Online (Sandbox Code Playgroud)
对我来说,a
和b
根据线性代数定义具有相同的形状:1列,3列,但不适合NumPy
.
现在,NumPy
dot
产品:
>>> np.dot(a,a)
14
>>> np.dot(b,a)
array([14])
>>> np.dot(b,b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: objects are not aligned
Run Code Online (Sandbox Code Playgroud)
我有三种不同的输出.
dot(a,a)
和之间有什么区别dot(b,a)
?为什么点(b,b)
不起作用?
我对这些点产品也有一些不同之处:
>>> c = np.ones(9).reshape(3,3)
>>> np.dot(a,c)
array([ 6., 6., 6.])
>>> np.dot(b,c)
array([[ 6., 6., 6.]])
Run Code Online (Sandbox Code Playgroud)
jor*_*ris 19
请注意,您不仅使用1D数组:
In [6]: a.ndim
Out[6]: 1
In [7]: b.ndim
Out[7]: 2
Run Code Online (Sandbox Code Playgroud)
那么,b
是一个二维数组.您还会在输出中看到这一点b.shape
:(1,3)表示两个维度(3,)是一个维度.
np.dot
对于1D和2D数组(来自文档),行为是不同的:
对于二维阵列,它相当于矩阵乘法,而对于一维阵列则相当于向量的内积
这就是你得到不同结果的原因,因为你正在混合1D和2D数组.由于b
是2D数组,因此np.dot(b, b)
在两个1x3矩阵上尝试矩阵乘法,这会失败.
对于1D数组,np.dot执行向量的内积:
In [44]: a = np.array([1,2,3])
In [45]: b = np.array([1,2,3])
In [46]: np.dot(a, b)
Out[46]: 14
In [47]: np.inner(a, b)
Out[47]: 14
Run Code Online (Sandbox Code Playgroud)
对于2D阵列,它是矩阵乘法(因此1x3 x 3x1 = 1x1,或3x1 x 1x3 = 3x3):
In [49]: a = a.reshape(1,3)
In [50]: b = b.reshape(3,1)
In [51]: a
Out[51]: array([[1, 2, 3]])
In [52]: b
Out[52]:
array([[1],
[2],
[3]])
In [53]: np.dot(a,b)
Out[53]: array([[14]])
In [54]: np.dot(b,a)
Out[54]:
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
In [55]: np.dot(a,a)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-55-32e36f9db916> in <module>()
----> 1 np.dot(a,a)
ValueError: objects are not aligned
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
40880 次 |
最近记录: |