在 Numpy 中将行向量转换为列向量

Posted

技术标签:

【中文标题】在 Numpy 中将行向量转换为列向量【英文标题】:Transforming a row vector into a column vector in Numpy 【发布时间】:2016-07-22 22:31:24 【问题描述】:

假设我有一个形状为 (1, 256) 的行向量。我想将其转换为形状 (256, 1) 的列向量。你会如何在 Numpy 中做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用 transpose 操作来执行此操作:

例子:

In [2]: a = np.array([[1,2], [3,4], [5,6]])
In [5]: a.shape
Out[5]: (3, 2)

In [6]: a_trans = a.T    #or: np.transpose(a), a.transpose()
In [8]: a_trans.shape
Out[8]: (2, 3)
In [7]: a_trans
Out[7]: 
array([[1, 3, 5],
       [2, 4, 6]])

请注意,原始数组 a 仍将保持不变。转置操作只会复制并转置它。


如果您的输入数组是一维数组,那么您可以通过引入一个新的(单例)轴作为第二维来将数组提升为列向量。下面是一个例子:

# 1D array
In [13]: arr = np.arange(6)

# promotion to a column vector (i.e., a 2D array)
In [14]: arr = arr[..., None]    #or: arr = arr[:, np.newaxis]

In [15]: arr
Out[15]: 
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5]])

In [12]: arr.shape
Out[12]: (6, 1)

对于一维情况,另一种选择是使用numpy.atleast_2d(),后跟转置操作as suggested by ankostis in the comments。

In [9]: np.atleast_2d(arr).T
Out[9]: 
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5]])

【讨论】:

谢谢!我是 numpy 的新手,所以这真的很有帮助。 对于一维数组,这没有效果。 (要在列向量和行向量之间切换,首先将一维数组转换为矩阵对象。),docs.scipy.org/doc/numpy-1.10.0/reference/generated/… 因为对于一维数组,我们只有一个维。至少在数学上没有为此类数组定义转置。 对于一维数组,应用 np.atleast_2d() 并获得二维列向量。 谢谢。您可以使用np.atleast_2d(),然后使用T,正如我在上面的评论中所建议的那样。【参考方案2】:

我们可以简单地使用 numpy 的 reshape 功能:

a=np.array([[1,2,3,4]])
a:
array([[1, 2, 3, 4]])

a.shape
(1,4)
b=a.reshape(-1,1)
b:
array([[1],
       [2],
       [3],
       [4]])

b.shape
(4,1)

【讨论】:

如果您能解释一下代码的作用,这将是一个更好的答案。 参见this answer to the question transpose a 1 dimensional array “-1 类似于广播,使用所有可能的元素,而 1 创建第二个必需的维度。”【参考方案3】:

我编译的一些方法是:

>>> import numpy as np
>>> a = np.array([1, 2, 3], [2, 4, 5])
>>> a
array([[1, 2],
       [2, 4],
       [3, 5]])

另一种方法:

>>> a.T
array([[1, 2],
       [2, 4],
       [3, 5]])

另一种方法是:

>>> a.reshape(a.shape[1], a.shape[0])
array([[1, 2],
       [3, 2],
       [4, 5]])

我在所有这些问题中都使用了二维数组,真正的问题出现在你想要优雅地列化的一维行向量时。

Numpy 的reshape 有一个功能,您可以传递您想要的维度(行数或列数),如果您将另一个维度传递为-1,numpy 可以自行计算出另一个维度/p>

>>> a.reshape(-1, 1)
array([[1],
       [2],
       [3],
       [2],
       [4],
       [5]])
       
>>> a = np.array([1, 2, 3])
>>> a.reshape(-1, 1)
array([[1],
       [2],
       [3]])
       
>>> a.reshape(2, -1)
...
ValueError: cannot reshape array of size 3 into shape (2,newaxis)

因此,只要(m * n) / your_choice 是整数,您就可以选择一维而不用担心其他维度。

如果您想了解有关此-1 的更多信息,请访问: What does -1 mean in numpy reshape?

注意:所有这些操作都返回一个新的数组,不修改原始数组。

【讨论】:

【参考方案4】:

你可以使用numpy对象的reshape()方法。

要将任何行向量转换为列向量,请使用

array.reshape(-1, 1)

要将任何列向量转换为行向量,请使用

array.reshape(1, -1)

reshape() 用于改变矩阵的形状。 所以如果你想创建一个 2x2 矩阵,你可以调用a.reshape(2, 2)之类的方法。

那么为什么答案中会出现这个-1

如果您不想明确指定一个维度(或未知维度)并希望 numpy 为您找到值,您可以将 -1 传递给该维度。所以 numpy 会自动为你从 ramaining 维度计算值。请记住,您不能将 -1 传递给多个维度。

因此,在第一种情况下(array.reshape(-1, 1)),第二个维度(列)是一个(1),而第一个(行)是未知的(-1)。所以 numpy 会弄清楚如何将 1×4 表示为 x×1 并为您找到 x。

使用重塑方法的替代解决方案是a.reshape(a.shape[1], a.shape[0])。在这里,您明确指定了 Diemsions。

【讨论】:

【参考方案5】:

在 Python 中将行向量转换为 列向量 可能很重要,例如使用广播

import numpy as np

def colvec(rowvec):
    v = np.asarray(rowvec)
    return v.reshape(v.size,1)

colvec([1,2,3]) * [[1,2,3], [4,5,6], [7,8,9]]

将第一行乘以 1,第二行乘以 2,第三行乘以 3:

array([[ 1,  2,  3],
       [ 8, 10, 12],
       [  21, 24, 27]])

相比之下,尝试使用类型为矩阵的列向量:

np.asmatrix([1, 2, 3]).transpose() * [[1,2,3], [4,5,6], [7,8,9]]

失败并出现错误ValueError: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)

【讨论】:

【参考方案6】:

使用np.newaxis 可能有点违反直觉。但这是可能的。

>>> a = np.array([1,2,3])
>>> a.shape
(3,)
>>> a[:,np.newaxis].shape
(3, 1)
>>> a[:,None]
array([[1],
       [2],
       [3]])

np.newaxis 在内部等于 None。所以你可以使用None。 但不推荐,因为它会损害可读性

【讨论】:

以上是关于在 Numpy 中将行向量转换为列向量的主要内容,如果未能解决你的问题,请参考以下文章

如何将向量重新排列为列而不是行?

python 将3D数组转换为列向量

如何在 C++ 中将一组整数转换为 3D 向量?

如何在初始化期间将 std::initializer_list 转换为列矩阵或列向量?

在实体框架中将行转换为列

在R中将行转换为列