在 Numpy 中将行向量转换为列向量
Transforming a row vector into a column vector in Numpy
假设我有一个形状为 (1, 256) 的行向量。我想将其转换为 (256, 1) 形状的列向量。在 Numpy 中你会怎么做?
你可以使用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)
对于 1D 情况,另一种选择是使用 numpy.atleast_2d()
followed by a transpose operation, 。
In [9]: np.atleast_2d(arr).T
Out[9]:
array([[0],
[1],
[2],
[3],
[4],
[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)
。
我们可以简单地使用 numpy 的重塑功能:
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)
我编译的一些方法是:
>>> 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
有一个功能,你可以传递你想要的维度之一(行数或列数),如果你传递另一个维度,numpy 可以自己计算出另一个维度-1
>>> 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?
注意:所有这些操作return一个新数组并且不修改原数组。
你可以使用reshape()numpy对象的方法。
要将任何行向量转换为列向量,请使用
array.reshape(-1, 1)
要将任何列向量转换为行向量,请使用
array.reshape(1, -1)
reshape()用于改变矩阵的形状。
因此,如果您想创建一个 2x2 矩阵,您可以调用 a.reshape(2, 2)
.
之类的方法
那么为什么这个 -1 在答案中?
如果您不想明确指定一个维度(或未知维度)并希望 numpy 为您找到值,您可以将 -1 传递给该维度。所以 numpy 会自动根据剩余维度为你计算值。请记住,您不能将 -1 传递给多维。
因此在第一种情况下(array.reshape(-1, 1)
),第二个维度(列)是一个(1),第一个(行)是未知的(-1)。所以 numpy 会弄清楚如何将 1×4 表示为 x×1 并为你找到 x。
使用重塑方法的替代解决方案是 a.reshape(a.shape[1], a.shape[0])
。此处您明确指定了 diemsions。
使用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
。
但是不推荐,因为会影响可读性
假设我有一个形状为 (1, 256) 的行向量。我想将其转换为 (256, 1) 形状的列向量。在 Numpy 中你会怎么做?
你可以使用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)
对于 1D 情况,另一种选择是使用 numpy.atleast_2d()
followed by a transpose operation,
In [9]: np.atleast_2d(arr).T
Out[9]:
array([[0],
[1],
[2],
[3],
[4],
[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)
。
我们可以简单地使用 numpy 的重塑功能:
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)
我编译的一些方法是:
>>> 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
有一个功能,你可以传递你想要的维度之一(行数或列数),如果你传递另一个维度,numpy 可以自己计算出另一个维度-1
>>> 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?
注意:所有这些操作return一个新数组并且不修改原数组。
你可以使用reshape()numpy对象的方法。
要将任何行向量转换为列向量,请使用
array.reshape(-1, 1)
要将任何列向量转换为行向量,请使用
array.reshape(1, -1)
reshape()用于改变矩阵的形状。
因此,如果您想创建一个 2x2 矩阵,您可以调用 a.reshape(2, 2)
.
那么为什么这个 -1 在答案中?
如果您不想明确指定一个维度(或未知维度)并希望 numpy 为您找到值,您可以将 -1 传递给该维度。所以 numpy 会自动根据剩余维度为你计算值。请记住,您不能将 -1 传递给多维。
因此在第一种情况下(array.reshape(-1, 1)
),第二个维度(列)是一个(1),第一个(行)是未知的(-1)。所以 numpy 会弄清楚如何将 1×4 表示为 x×1 并为你找到 x。
使用重塑方法的替代解决方案是 a.reshape(a.shape[1], a.shape[0])
。此处您明确指定了 diemsions。
使用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
。
但是不推荐,因为会影响可读性