Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:具有各种形状的一维阵列_Python_Arrays_Numpy - Fatal编程技术网

Python Numpy:具有各种形状的一维阵列

Python Numpy:具有各种形状的一维阵列,python,arrays,numpy,Python,Arrays,Numpy,我试图理解如何使用NumPy处理1D数组(线性代数中的向量) 在下面的示例中,我生成了两个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) 对我来说,a和b根据线性代

我试图理解如何使用
NumPy
处理
1D
数组(线性代数中的向量)

在下面的示例中,我生成了两个
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)
对我来说,
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

请注意,您不仅使用1D阵列:

In [6]: a.ndim
Out[6]: 1

In [7]: b.ndim
Out[7]: 2
因此,
b
是一个2D数组。 在
b的输出中也可以看到这一点。shape
:(1,3)表示两个维度,因为(3,)是一个维度

对于1D和2D阵列,
np.dot
的行为有所不同(不同于:

对于二维数组,它等价于矩阵乘法;对于一维数组,它等价于矩阵乘法 向量内积的数组

这就是得到不同结果的原因,因为您混合了一维和二维阵列。由于
b
是二维数组,
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
对于2D数组,它是矩阵乘法(因此1x3 x 3x1=1x1或3x1 x 1x3=3x3):

[49]中的
:a=a.重塑(1,3)
[50]:b=b.重塑(3,1)
在[51]中:a
Out[51]:数组([[1,2,3]])
在[52]中:
出[52]:
数组([[1],
[2],
[3]])
In[53]:np.dot(a,b)
Out[53]:数组([[14]])
In[54]:np.dot(b,a)
出[54]:
数组([[1,2,3],
[2, 4, 6],
[3, 6, 9]])
In[55]:np.dot(a,a)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1 np.dot(a,a)
ValueError:对象未对齐

谢谢你的回答。那么,如果我想用numpy做一些线性代数,最好的做法是什么?在2D numpy.array中转换所有向量?我有点被两种不同的形状弄糊涂了…我自己并没有做很多线性代数,但我认为这取决于你们到底想做什么。只要向量积和其他简单的操作/计算,1D就可以了。如果你想做矩阵计算等,你应该使用2D。最好的策略是用一维数组表示向量,用二维数组表示矩阵。像具有形状
(1,3)
的二维数组这样的构造主要用于数组魔术,但不是标准的线性代数内容。就线性代数而言,这将对应于
1x3
矩阵的不太有用的对象。
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
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