Вычитание минимума ряда из ряда - PullRequest
1 голос
/ 20 марта 2019

Я знаю, что

a - a.min (ось = 0)

будет вычитать минимум каждого столбца из каждого элемента в столбце. Я хочу вычесть минимум в каждой строке из каждого элемента в строке. Я знаю, что

a.min (ось = 1)

определяет минимум в строке, но как я могу сказать вычитание идти по строкам вместо столбцов? (Как мне указать ось вычитания?)

edit: На мой вопрос a - это двумерный массив в NumPy.

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Предполагая, что 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) возвращает 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 голос
/ 20 марта 2019

Укажите keepdims=True, чтобы сохранить измерение длины-1 вместо измерения, которое сворачивается min, что позволяет вещанию работать естественным образом:

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

Это особенно удобно, когда axisопределяется во время выполнения, но все еще, вероятно, яснее, чем повторное введение сжатого измерения вручную, даже когда значение 1 фиксировано.

0 голосов
/ 20 марта 2019

Если вы хотите использовать только 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))
...