从行中减去行的最小值

时间:2019-03-19 22:38:43

标签: python numpy numpy-ndarray

我知道

a-a.min(axis = 0)

将从列中的每个元素中减去每一列的最小值。我想从该行的每个元素中减去每一行的最小值。我知道

a.min(axis = 1)

指定一行中的最小值,但是如何告诉减法是按行而不是按列呢? (如何指定减法轴?)

编辑:对于我的问题,a是NumPy中的2d数组。

3 个答案:

答案 0 :(得分:2)

假设a是一个numpy数组,则可以使用以下命令:

new_a = a - np.min(a, axis=1)[:,None]

尝试一下:

import numpy as np

a = np.arange(24).reshape((4,6))
print (a)
new_a = a - np.min(a, axis=1)[:,None]
print (new_a)

结果:

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[0 1 2 3 4 5]
 [0 1 2 3 4 5]
 [0 1 2 3 4 5]
 [0 1 2 3 4 5]]

请注意,np.min(a, axis=1)返回一维按行最小值的数组。

我们比使用[:,None]为其添加了额外的尺寸。然后看起来像这个2d数组:

array([[ 0],
       [ 6],
       [12],
       [18]])

当这个2d数组参与减法时,它被广播为(4,6)的形状,如下所示:

array([[ 0,  0,  0,  0,  0,  0],
       [ 6,  6,  6,  6,  6,  6],
       [12, 12, 12, 12, 12, 12],
       [18, 18, 18, 18, 18, 18]])

现在,在两个(4,6)数组之间进行逐元素减法。

答案 1 :(得分:1)

指定keepdims=True保留长度为1的尺寸,以代替min折叠的尺寸,从而使广播工作自然进行:

a - a.min(axis=1, keepdims=True)

在运行时确定axis时,这特别方便,但即使固定1值,也仍然比手动重新引入压缩尺寸更清晰。

答案 2 :(得分:0)

如果您只想使用pandas,则可以使用min(row)

将lambda应用于每列
new_df = pd.DataFrame()
for i, col in enumerate(df.columns):
    new_df[col] = df.apply(lambda row: row[i] - min(row))