numpy 不能将行向量转置为列?
numpy can't transpose row vector into column?
numpy好像不能转置向量?
我想将一个向量投影到一个矩阵中,你可以使用 np.tile -
对行进行没问题
In [7]: vector = np.arange(start=0,stop=1,step=1.0/5)
In [8]: mat = np.tile(vector, (2,1))
In [9]: mat
Out[9]: array([[ 0. , 0.2, 0.4, 0.6, 0.8],
[ 0. , 0.2, 0.4, 0.6, 0.8]])
但是如果你想将同一个向量平铺成一列,你似乎必须这样做
In[11]: mat = np.tile(vector,(2,1))
In[12]: mat=mat.transpose()
In[13]: mat
Out[13]: array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
而不是更合乎逻辑的(无论如何对我来说)
In[30]: mat = np.tile(vector.transpose(),(1,2))
它没有给出所需的结果,而是给出一个行向量,转置无关紧要 -
Out[31]: array([[ 0. , 0.2, 0.4, 0.6, 0.8, 0. , 0.2, 0.4, 0.6, 0.8]])
虽然这不是什么大问题,但我担心它的不公正性
transpose
在一维数组上实际上没有做任何事情。一种替代方法是首先将 vector 重塑为 2d,从中获得两个轴,然后您可以使用 np.tile
和 reps 参数为每个轴指定:
np.tile(vector[:,None], (1,2))
#array([[ 0. , 0. ],
# [ 0.2, 0.2],
# [ 0.4, 0.4],
# [ 0.6, 0.6],
# [ 0.8, 0.8]])
来自项目/
kill
from numpy.lib.stride_tricks import as_strided as strided
strided(vector, (vector.size, 2), (vector.strides[0], 0))
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
__
strided(vector, (2, vector.size), (0, vector.strides[0]))
array([[ 0. , 0.2, 0.4, 0.6, 0.8],
[ 0. , 0.2, 0.4, 0.6, 0.8]])
有很多方法可以创建这样的数组。
repeat
比 tile
快,reshape
几乎没有成本:
In [112]: v=np.arange(0,1,1/5)
In [113]: v
Out[113]: array([ 0. , 0.2, 0.4, 0.6, 0.8])
In [114]: np.repeat(v,2)
Out[114]: array([ 0. , 0. , 0.2, 0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8])
In [115]: np.repeat(v,2).reshape(-1,2)
Out[115]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
或将 v
变成 'column vector' newaxis
:
In [118]: np.repeat(v[:,None],2,axis=1)
Out[118]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
In [119]: v[:,None]+np.zeros(2)
Out[119]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
In [120]: np.column_stack([v]*2)
Out[120]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
In [124]: np.broadcast_to(v[:,None],(v.shape[0],2))
Out[124]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
这最后一个实际上做了 @piRSquared's
跨步技巧:
In [125]: _.strides
Out[125]: (8, 0)
v[:,None]
也可以用 v[None,:].T
(或 v[None].T
)
生成
numpy好像不能转置向量? 我想将一个向量投影到一个矩阵中,你可以使用 np.tile -
对行进行没问题In [7]: vector = np.arange(start=0,stop=1,step=1.0/5)
In [8]: mat = np.tile(vector, (2,1))
In [9]: mat
Out[9]: array([[ 0. , 0.2, 0.4, 0.6, 0.8],
[ 0. , 0.2, 0.4, 0.6, 0.8]])
但是如果你想将同一个向量平铺成一列,你似乎必须这样做
In[11]: mat = np.tile(vector,(2,1))
In[12]: mat=mat.transpose()
In[13]: mat
Out[13]: array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
而不是更合乎逻辑的(无论如何对我来说)
In[30]: mat = np.tile(vector.transpose(),(1,2))
它没有给出所需的结果,而是给出一个行向量,转置无关紧要 -
Out[31]: array([[ 0. , 0.2, 0.4, 0.6, 0.8, 0. , 0.2, 0.4, 0.6, 0.8]])
虽然这不是什么大问题,但我担心它的不公正性
transpose
在一维数组上实际上没有做任何事情。一种替代方法是首先将 vector 重塑为 2d,从中获得两个轴,然后您可以使用 np.tile
和 reps 参数为每个轴指定:
np.tile(vector[:,None], (1,2))
#array([[ 0. , 0. ],
# [ 0.2, 0.2],
# [ 0.4, 0.4],
# [ 0.6, 0.6],
# [ 0.8, 0.8]])
来自项目/
kill
from numpy.lib.stride_tricks import as_strided as strided
strided(vector, (vector.size, 2), (vector.strides[0], 0))
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
__
strided(vector, (2, vector.size), (0, vector.strides[0]))
array([[ 0. , 0.2, 0.4, 0.6, 0.8],
[ 0. , 0.2, 0.4, 0.6, 0.8]])
有很多方法可以创建这样的数组。
repeat
比 tile
快,reshape
几乎没有成本:
In [112]: v=np.arange(0,1,1/5)
In [113]: v
Out[113]: array([ 0. , 0.2, 0.4, 0.6, 0.8])
In [114]: np.repeat(v,2)
Out[114]: array([ 0. , 0. , 0.2, 0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8])
In [115]: np.repeat(v,2).reshape(-1,2)
Out[115]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
或将 v
变成 'column vector' newaxis
:
In [118]: np.repeat(v[:,None],2,axis=1)
Out[118]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
In [119]: v[:,None]+np.zeros(2)
Out[119]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
In [120]: np.column_stack([v]*2)
Out[120]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
In [124]: np.broadcast_to(v[:,None],(v.shape[0],2))
Out[124]:
array([[ 0. , 0. ],
[ 0.2, 0.2],
[ 0.4, 0.4],
[ 0.6, 0.6],
[ 0.8, 0.8]])
这最后一个实际上做了 @piRSquared's
跨步技巧:
In [125]: _.strides
Out[125]: (8, 0)
v[:,None]
也可以用 v[None,:].T
(或 v[None].T
)