Python Numpy:具有各种形状的一维数组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15680593/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Numpy: 1D array with various shape
提问by Marcel
I try to understand how to handle a 1Darray (vector in linear algebra) with NumPy.
我试图了解如何处理1D数组(线性代数中的向量)NumPy。
In the following example, I generate two numpy.arrayaand b:
在以下示例中,我生成了两个numpy.arraya和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)
For me, aand bhave the same shape according linear algebra definition: 1 row, 3 columns, but not for NumPy.
对我来说,a和b根据线性代数定义具有相同的形状:1列,3列,但不适合NumPy。
Now, the NumPydotproduct:
现在,NumPydot产品:
>>> 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
I have three different outputs.
我有三个不同的输出。
What's the difference between dot(a,a)and dot(b,a)? Why dot(b,b)doesn't work?
dot(a,a)和 和有dot(b,a)什么区别?为什么点(b,b)不起作用?
I also have some differencies with those dot products:
我与那些点积也有一些不同之处:
>>> c = np.ones(9).reshape(3,3)
>>> np.dot(a,c)
array([ 6., 6., 6.])
>>> np.dot(b,c)
array([[ 6., 6., 6.]])
采纳答案by joris
Notice you are not only working with 1D arrays:
请注意,您不仅要使用一维数组:
In [6]: a.ndim
Out[6]: 1
In [7]: b.ndim
Out[7]: 2
So, bis a 2D array.
You also see this in the output of b.shape: (1,3) indicates two dimensions as (3,) is one dimension.
所以,b是一个二维数组。您还可以在以下输出中看到这一点b.shape:(1,3) 表示二维,因为 (3,) 是一维。
The behaviour of np.dotis different for 1D and 2D arrays (from the docs):
np.dot一维和二维数组的行为不同(来自文档):
For 2-D arrays it is equivalent to matrix multiplication, and for 1-D arrays to inner product of vectors
对于二维数组,它等效于矩阵乘法,对于一维数组等效于向量的内积
That is the reason you get different results, because you are mixing 1D and 2D arrays. Since bis a 2D array, np.dot(b, b)tries a matrix multiplication on two 1x3 matrices, which fails.
这就是您得到不同结果的原因,因为您正在混合一维和二维数组。由于b是 2D 数组,np.dot(b, b)尝试对两个 1x3 矩阵进行矩阵乘法,但失败。
With 1D arrays, np.dot does a inner product of the vectors:
对于一维数组,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
With 2D arrays, it is a matrix multiplication (so 1x3 x 3x1 = 1x1, or 3x1 x 1x3 = 3x3):
对于二维数组,它是一个矩阵乘法(所以 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

