在 Numpy 中将 1D 数组转换为行或列向量



我对数组和向量的 NumPy 概念感到困惑,假设我们有一个如下所示的一维数组。从"形状"方法中,我可以看到尺寸。(10,)表示具有 10 个元素的 1 个维度。

a = np.arange(10)
print(a)
a.shape
[0 1 2 3 4 5 6 7 8 9]
(10,)

现在我了解了一种叫做np.newaxis的方法,将数组转换为行向量。所以我想知道在 NumPy 中我们是否假设行或列向量总是具有二维?(我认为在线性代数中,向量可以存在于任何维度中,或者当我们提到"维度"时,NumPy 和线性代数存在概念差异?由于向量是通过调用np.newaxis添加 1 维来转换的。

print(a[np.newaxis:])
print(a[np.newaxis,:].shape)
[0 1 2 3 4 5 6 7 8 9]
(1, 10)

请注意,DIMENSION词在不同的上下文中可能具有不同的含义。例如,在线性代数中,(1, 1( 是 2D 空间中的向量,(1, 1, 1( 是 3D 空间中的向量,它们都是编程语言中的一维数组。3D 向量的集合是线性代数中的矩阵和编程语言中的 2D 数组。

就线性代数形状而言,(10,(是1个10维向量或10个标量值。形状 (10,2( 是 2 个 10 维向量或 10 个二维向量。

让我们考虑线性代数矩阵乘法公式:

AB(i,j) = sum(A[i,k] * B[k,j])

如果我们假设行向量是维度 (1, N( 的矩阵,而列向量是维度 (N, 1( 的矩阵,则此公式对向量仍然有效。

NumPy使用相同的方法。但是NumPy不仅允许2D数组,还允许1D,3D等。这样的数组对于其他计算模型很有用。如果你对此感兴趣,你可以阅读更多关于张量的信息。

您可以使用.reshape(...)方法重新排列ndarray元素。更改数组的形状时,所有元素都保留在原位,但元素的寻址会发生变化。

如果我们假设行向量和列向量是特殊对象,我们将被迫使计算规则复杂化,这是非常不切实际的。

给定一个numpy 1d数组,我们可以在概念上称之为vector,因为它是一维值序列,能够创建概念上称为column vectorrow vector的东西很有用,其值与原始vector相同。

在 numpy 中,概念column vector对应于具有 1 列的 2d 数组,概念row vector对应于具有 1 行的 2d 数组。

可以使用 numpy 常量np.newaxis或简单地None(因为np.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')

输出:

[0 1 2]
[[0 1 2]]
[[0]
[1]
[2]]

只需运行以下命令:

a.reshape(-1,1)

如果你想重塑数组,你应该使用:

new_array = np.reshape(old_array, (-1, 2))

其中 -1 是给定数组大小的新数组的大小。

最新更新