【问题标题】:numpy can't transpose row vector into column?numpy 不能将行向量转换成列?
【发布时间】:2017-06-01 21:42:00
【问题描述】:

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]])

虽然这不是一个大问题,但我担心它的不公正

【问题讨论】:

  • 转置切换尺寸。对于一维数组,这意味着将第一维与第一维切换。

标签: python numpy matrix vector transpose


【解决方案1】:

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]])

【讨论】:

  • @jeremy_rutman:通过利用NumPy broadcasting,您或许可以只使用vector[:, None],而不是使用np.tile(vector[:,None], (1,2)) 显式平铺。
【解决方案2】:

有很多方法可以创建这样的数组。

repeattile 快,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]])

或者用newaxisv变成一个“列向量”:

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)产生

【讨论】:

    【解决方案3】:

    来自项目/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]])
    

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 2016-07-22
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      相关资源
      最近更新 更多