如何确保 numpy 数组是二维行向量或列向量?

nor*_*ius 5 python numpy

是否有一个numpy函数可以确保一维或二维数组是列向量或行向量?

例如,我有以下向量/列表之一。将任何输入转换为列向量的最简单方法是什么?

x1 = np.array(range(5))
x2 = x1[np.newaxis, :]
x3 = x1[:, np.newaxis]

def ensureCol1D(x):
    # The input is either a 0D list or 1D.
    assert(len(x.shape)==1 or (len(x.shape)==2 and 1 in x.shape))
    x = np.atleast_2d(x)
    n = x.size
    print(x.shape, n)
    return x if x.shape[0] == n else x.T

assert(ensureCol1D(x1).shape == (x1.size, 1))
assert(ensureCol1D(x2).shape == (x2.size, 1))
assert(ensureCol1D(x3).shape == (x3.size, 1))
Run Code Online (Sandbox Code Playgroud)

不是编写我自己的函数ensureCol1D,是否有类似的东西可以numpy确保向量成为列?

Pri*_*usa 5

您的问题本质上是如何将数组转换为“列”,列是行长度为 1 的二维数组。这可以通过ndarray.reshape(-1, 1).

这意味着您reshape的数组的行长度为一,并让 numpy 推断行数/列长度。

x1 = np.array(range(5))
print(x1.reshape(-1, 1))
Run Code Online (Sandbox Code Playgroud)

输出:

array([[0],
   [1],
   [2],
   [3],
   [4]])
Run Code Online (Sandbox Code Playgroud)

x2重塑和时您会得到相同的输出x3。此外,这也适用于 n 维数组:

x = np.random.rand(1, 2, 3)
print(x.reshape(-1, 1).shape)
Run Code Online (Sandbox Code Playgroud)

输出:

(6, 1)
Run Code Online (Sandbox Code Playgroud)

最后,这里唯一缺少的是您进行一些断言,以确保无法转换的数组不会被错误地转换。您要做的主要检查是形状中非一整数的数量是否小于或等于一。这可以通过以下方式完成:

assert sum(i != 1 for i in x1.shape) <= 1
Run Code Online (Sandbox Code Playgroud)

通过此检查,.reshape您可以将逻辑应用于所有 numpy 数组。