【问题标题】:Row-wise scaling with Numpy使用 Numpy 进行逐行缩放
【发布时间】:2013-01-16 08:12:05
【问题描述】:

我有一个维度为 MxN 的数组 H 和一个维度为 M 的数组 A 。我想用数组 A 缩放 H 行。我这样做是利用 Numpy 的逐元素行为

H = numpy.swapaxes(H, 0, 1)
H /= A
H = numpy.swapaxes(H, 0, 1)

它可以工作,但是两个 swapaxes 操作不是很优雅,我觉得有一种更优雅和简洁的方式来实现结果,而无需创建临时对象。你能告诉我怎么做吗?

【问题讨论】:

标签: python numpy


【解决方案1】:

您只需要重塑A 以便正确广播:

A = A.reshape((-1, 1))

所以:

In [21]: M
Out[21]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20]])


In [22]: A
Out[22]: array([1, 2, 3, 4, 5, 6, 7])


In [23]: M / A.reshape((-1, 1))
Out[23]: 
array([[0, 1, 2],
       [1, 2, 2],
       [2, 2, 2],
       [2, 2, 2],
       [2, 2, 2],
       [2, 2, 2],
       [2, 2, 2]])

【讨论】:

    【解决方案2】:

    我认为你可以简单地使用H/A[:,None]:

    In [71]: (H.swapaxes(0, 1) / A).swapaxes(0, 1)
    Out[71]: 
    array([[  8.91065496e-01,  -1.30548362e-01,   1.70357901e+00],
           [  5.06027691e-02,   3.59913305e-01,  -4.27484490e-03],
           [  4.72868136e-01,   2.04351398e+00,   2.67527572e+00],
           [  7.87239835e+00,  -2.13484271e+02,  -2.44764975e+02]])
    
    In [72]: H/A[:,None]
    Out[72]: 
    array([[  8.91065496e-01,  -1.30548362e-01,   1.70357901e+00],
           [  5.06027691e-02,   3.59913305e-01,  -4.27484490e-03],
           [  4.72868136e-01,   2.04351398e+00,   2.67527572e+00],
           [  7.87239835e+00,  -2.13484271e+02,  -2.44764975e+02]])
    

    因为None(或newaxis)在维度A 中扩展(example link)

    In [73]: A
    Out[73]: array([ 1.1845468 ,  1.30376536, -0.44912446,  0.04675434])
    
    In [74]: A[:,None]
    Out[74]: 
    array([[ 1.1845468 ],
           [ 1.30376536],
           [-0.44912446],
           [ 0.04675434]])
    

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 2013-11-08
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多