我对 NumPy 数组和向量的概念感到困惑,假设我们有一个如下所示的一维数组。从“形状”的方法中,我可以看到尺寸。(10,)表示 1 维有 10 个元素。
a = np.arange(10)
print(a)
a.shape
[0 1 2 3 4 5 6 7 8 9]
(10,)
Run Code Online (Sandbox Code Playgroud)
现在我知道了一种名为 的方法np.newaxis,用于将数组转换为行向量。所以我想知道在 NumPy 中我们是否假设行或列向量始终具有二维?(我认为在线性代数中,向量可以存在于任何维度,或者当我们提到“维度”时,NumPy 和线性代数在概念上存在差异?)。由于矢量是通过调用添加 1 维来转换的np.newaxis。
print(a[np.newaxis:])
print(a[np.newaxis,:].shape)
[0 1 2 3 4 5 6 7 8 9]
(1, 10)
Run Code Online (Sandbox Code Playgroud)
给定一个 numpy 1d 数组(我们可以在概念上将其称为 a,vector因为它是一维值序列),能够创建概念上称为 a或具有与原始 相同值的column vectorarow vectorvector的内容非常有用。
在 numpy 中,概念column vector对应于 1 列的 2d 数组,概念row vector对应于 1 行的 2d 数组。
这些可以轻松创建,如下所示,使用 numpy 常量np.newaxis或简单地None(sincenp.newaxis定义为 的别名None):
import numpy as np
vec = np.array([0, 1, 2])
row_vec = vec[None]
col_vec = vec[:, None]
print(vec, '\n')
print(row_vec, '\n')
print(col_vec, '\n')
Run Code Online (Sandbox Code Playgroud)
输出:
[0 1 2]
[[0 1 2]]
[[0]
[1]
[2]]
Run Code Online (Sandbox Code Playgroud)
请注意,“维度”一词在不同的上下文中可能有不同的含义。例如,在线性代数中,(1, 1) 是 2D 空间中的向量,(1, 1, 1) 是 3D 空间中的向量,并且它们都是编程语言中的 1D 数组。3D向量的集合是线性代数中的矩阵和编程语言中的2D数组。
就线性代数形状而言 (10,) 是 1 个 10 维向量或 10 个标量值。形状(10,2)是2个10维向量或10个2维向量。
让我们考虑线性代数矩阵乘法公式:
AB(i,j) = sum(A[i,k] * B[k,j])
Run Code Online (Sandbox Code Playgroud)
如果我们假设行向量是维度为 (1, N) 的矩阵,列向量是维度为 (N, 1) 的矩阵,则该公式对于向量仍然有效。
NumPy 使用相同的方法。但 NumPy 不仅允许 2D 数组,还允许 1D、3D 等。这样的数组对于其他计算模型很有用。如果您对此感兴趣,可以阅读有关张量的更多内容。
您可以重新排列ndarraywith.reshape(...)方法的元素。当改变数组的形状时,所有元素都保持在原位,但元素的寻址会改变。
如果我们假设行向量和列向量是特殊对象,我们将被迫使计算规则复杂化,这是非常不切实际的。