Jac*_*ain 9 python arrays numpy matrix
我是python和numpy的新手.我阅读了几个教程,但仍然对昏暗,等级,形状,aix和尺寸的差异感到困惑.我的想法似乎停留在矩阵表示.所以如果你说A是一个看起来像这样的矩阵:
A =
1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)
那么我能想到的只是一个2x3矩阵(两行三列).在这里,我知道形状是2x3.但我真的无法超越二维矩阵的思维.我不明白例如dot()文档,当它表示"对于N维,它是a的最后一个轴上的和产品,而b的倒数第二个".我很困惑,无法理解这一点.我不明白,如果V是N:1向量而M是N:N矩阵,点(V,M)或点(M,V)如何工作以及它们之间的差异.
那么有人可以向我解释什么是N维数组,什么是形状,什么是轴以及它如何与dot()函数的文档相关?如果解释可视化这些想法会很棒.
Fre*_*Foo 11
NumPy数组的维度必须在数据结构意义上理解,而不是数学意义,即它是获取标量值所需的标量索引的数量.(*)
例如,这是一个三维数组:
>>> X = np.arange(24).reshape(2, 3, 4)
>>> X
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
Run Code Online (Sandbox Code Playgroud)
索引一次给出一个二维数组(矩阵):
>>> X[0]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
Run Code Online (Sandbox Code Playgroud)
索引两次给出1-d数组(向量),索引三次给出标量.
等级X是它的维数:
>>> X.ndim
3
>>> np.rank(X)
3
Run Code Online (Sandbox Code Playgroud)
Axis大致是维度的同义词; 它用于广播业务:
>>> X.sum(axis=0)
array([[12, 14, 16, 18],
[20, 22, 24, 26],
[28, 30, 32, 34]])
>>> X.sum(axis=1)
array([[12, 15, 18, 21],
[48, 51, 54, 57]])
>>> X.sum(axis=2)
array([[ 6, 22, 38],
[54, 70, 86]])
Run Code Online (Sandbox Code Playgroud)
说实话,我发现这个"等级"的定义令人困惑,因为它既不匹配属性的名称ndim也不匹配秩的线性代数定义.
现在np.dot,你需要了解的是,在NumPy中有三种表示向量的方法:1-d数组,形状的列向量(n, 1)或形状的行向量(1, n).(实际上,有更多的方法,例如作为一个(1, n, 1)形状的数组,但这些很少见.)np.dot当两个参数都是1-d时执行向量乘法,当一个参数是1-d时执行矩阵向量乘法,另一个是2- d,否则执行(广义)矩阵乘法:
>>> A = np.random.randn(2, 3)
>>> v1d = np.random.randn(2)
>>> np.dot(v1d, A)
array([-0.29269547, -0.52215117, 0.478753 ])
>>> vrow = np.atleast_2d(v1d)
>>> np.dot(vrow, A)
array([[-0.29269547, -0.52215117, 0.478753 ]])
>>> vcol = vrow.T
>>> np.dot(vcol, A)
Traceback (most recent call last):
File "<ipython-input-36-98949c6de990>", line 1, in <module>
np.dot(vcol, A)
ValueError: matrices are not aligned
Run Code Online (Sandbox Code Playgroud)
规则"在最后一轴a和倒数第二轴上求和产品b"匹配并推广矩阵乘法的通用定义.
(*)数组dtype=object有点例外,因为它们将任何Python对象视为标量.
就你而言,
A是一个二维数组,即矩阵,其形状为(2, 3)。来自文档字符串 numpy.matrix:
矩阵是一种特殊的二维数组,通过运算保留其二维性质。
numpy.rank返回数组的维数,这与线性代数中的秩概念有很大不同,例如A是维数/秩为2的数组。
np.dot(V, M),或V.dot(M)将矩阵V与相乘M。请注意,numpy.dot 尽可能执行乘法。如果 V 是 N:1 并且 M 是 N:N,V.dot(M)则会引发ValueError。例如:
In [125]: a
Out[125]:
array([[1],
[2]])
In [126]: b
Out[126]:
array([[2, 3],
[1, 2]])
In [127]: a.dot(b)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-127-9a1f5761fa9d> in <module>()
----> 1 a.dot(b)
ValueError: objects are not aligned
Run Code Online (Sandbox Code Playgroud)
我不明白 (N,) 和 (N,1) 的形状之间的区别,它与 dot() 文档相关。
V形状 (N,) 表示长度为 N 的一维数组,而形状 (N, 1) 表示具有 N 行、1 列的 2D 数组:
In [2]: V = np.arange(2)
In [3]: V.shape
Out[3]: (2,)
In [4]: Q = V[:, np.newaxis]
In [5]: Q.shape
Out[5]: (2, 1)
In [6]: Q
Out[6]:
array([[0],
[1]])
Run Code Online (Sandbox Code Playgroud)
正如文档字符串所说np.dot:
对于二维数组,它相当于矩阵乘法,对于一维数组,它相当于向量的内积(没有复杂的共轭)。
如果参数之一是向量,它还会执行向量矩阵乘法。说V.shape==(2,); M.shape==(2,2):
In [17]: V
Out[17]: array([0, 1])
In [18]: M
Out[18]:
array([[2, 3],
[4, 5]])
In [19]: np.dot(V, M) #treats V as a 1*N 2D array
Out[19]: array([4, 5]) #note the result is a 1D array of shape (2,), not (1, 2)
In [20]: np.dot(M, V) #treats V as a N*1 2D array
Out[20]: array([3, 5]) #result is still a 1D array of shape (2,), not (2, 1)
In [21]: Q #a 2D array of shape (2, 1)
Out[21]:
array([[0],
[1]])
In [22]: np.dot(M, Q) #matrix multiplication
Out[22]:
array([[3], #gets a result of shape (2, 1)
[5]])
Run Code Online (Sandbox Code Playgroud)