使用 Numpy 进行逐行缩放
Posted
技术标签:
【中文标题】使用 Numpy 进行逐行缩放【英文标题】:Row-wise scaling with 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 操作不是很优雅,我觉得有一种更优雅和简洁的方式来实现结果,而无需创建临时对象。你能告诉我怎么做吗?
【问题讨论】:
How to normalize a 2-dimensional numpy array in python less verbose? 的可能重复项 【参考方案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]])
【讨论】:
以上是关于使用 Numpy 进行逐行缩放的主要内容,如果未能解决你的问题,请参考以下文章