当前位置: 首页 > 面试题库 >

numpy:各种形状的一维数组

盛承
2023-03-14
问题内容

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

在以下示例中,我生成两个numpy.array ab

>>> 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)

对我来说,ab根据线性代数定义具有相同的形状: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

我有三个不同的输出。

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.]])

问题答案:

请注意,您不仅在处理一维数组:

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

In [7]: b.ndim
Out[7]: 2

因此,b是2D阵列。您还可以在b.shape:(1,3)的输出中看到这一点,因为(3,)是一个维度,它表示两个维度。

np.dot1D和2D阵列的行为不同(来自docs):

对于2-D数组,它等效于矩阵乘法,对于1-D数组,其等效于向量的内积

这就是您获得不同结果的原因,因为您正在混合1D和2D数组。由于b是2D数组,请np.dot(b, b)尝试在两个1x3矩阵上进行矩阵乘法,但失败。

对于一维数组,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):

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


 类似资料:
  • 我是机器学习的初学者。虽然,这个问题类似于1,2,3,但我在为我的数据选择输入形状时真的很困惑。我在时间序列数据上使用1-D CNN。数据的维度是(6400,4)。有4个特征(列),其中一个是目标变量。拆分后: 我在为CNN选择输入形状时感到困惑。这就是我所尝试的(我一直保持输入shape=c(3,1)): 这执行得很好,但我不确定它是否正确。请告诉我这是否是设置输入形状的正确方法。

  • 问题内容: 我使用Python和NumPy,“移调”有一些问题: 调用不转置数组。例如,如果为,则它正确转置,但我需要的转置。 问题答案: 它的工作完全符合预期。一 维 数组的转置仍然是 一维 数组!(如果您习惯使用matlab,从根本上来说就没有1D数组的概念。Matlab的“ 1D”数组是2D。) 如果要将一维矢量转换为二维数组然后转置,只需对其进行切片(或者,它们是相同的,可读性更高)。 一

  • 我有一个从列表转换的数组,当我试图得到它的形状时,我只得到一个数字。这样地: 而我得到了 然后我试着 我明白了 好像a1的工作原理和a2一样。我能那样想吗?如果我把a1当成a2,除了形状法,会不会有问题?

  • 问题内容: 使用出色的numpy广播规则,您可以从形状(5,3)数组减去一个形状(3,)数组,其中 结果是一个形状(5,3)数组,其中每一行都是差异。 有没有一种方法可以从中减去一个形状(n,3)数组,以便在不显式使用循环的情况下从整个数组中减去每一行? 问题答案: 您需要扩展with的尺寸以形成3D数组,然后通过进行减法。这将对该操作起作用,并导致输出形状为。实现看起来像这样- 相反,如果所需的

  • 形状为- (442,1)和(442,)? 打印这两个命令会产生相同的输出,但当我检查等式==时,会得到如下2D向量- 有人可以解释其中的区别吗?

  • 问题内容: 我要执行以下操作: 不使用循环。最后,A和B包含相同的信息,但索引不同。 我必须指出,尺寸1,2,3和4可以相同或不同。因此,numpy.reshape()似乎很困难。 问题答案: 请注意:Jaime的答案更好。NumPy正是为此目的而提供的。 在numpy中执行此操作的规范方法是使用的可选置换参数。在您的情况下,从i转到,排列是,例如: 或者使用np.einsum ; 这可能是其预期