我知道
a-a.min(axis = 0)
将从列中的每个元素中减去每一列的最小值。我想从该行的每个元素中减去每一行的最小值。我知道
a.min(axis = 1)
指定一行中的最小值,但是如何告诉减法是按行而不是按列呢? (如何指定减法轴?)
编辑:对于我的问题,a是NumPy中的2d数组。
答案 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)
new_df = pd.DataFrame()
for i, col in enumerate(df.columns):
new_df[col] = df.apply(lambda row: row[i] - min(row))