Для данной матрицы я вычитаю максимум каждой строки из строки. В MATLAB я бы сделал что-то вроде
Xm = X - repmat(max(X,[],2), 1, size(X,2));
Для Python я играл с вариациями
Xm = X - np.matlib.repmat(np.max(X,axis = 1), 1, len(X[0]))
но безуспешно!
Где именно я упускаю? Большое спасибо.
В Python/NumPy явная репликация массива, чтобы сделать его совпадающим с другим, не требуется. Размеры размера 1 (размер одноэлементности) автоматически расширяются в процессе, который они называют "трансляцией".
Например, данный
X = np.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
ты можешь написать
X - np.max(X, axis=0)
Массив, возвращаемый np.max
имеет форму (5,)
, которая совместима с формой X
((3, 5)
). NumPy выравнивает фигуры, начиная с последнего измерения, и заполняет размеры синглтона спереди, если один массив имеет меньшее, чем другое.
Однако этот процесс иногда требует некоторой помощи. Поскольку np.max
возвращает массив с меньшим количеством измерений, чем вход, широковещание не может, в общем. соответствуют этим массивам. Например, X - np.max(X, axis=1)
не работает.
Наилучшим решением является использование keepdims
аргумент np.max
:
X - np.max(X, axis=1, keepdims=True)
Другой вариант - добавить размеры синглтона, используя np.newaxis
при индексировании:
X - np.max(X, axis=1)[:, np.newaxis]
np.sum
похож наnp.max
, вы можете добавить аргументkeepdims=True
. Тогда дивизия сможет вещать.