Repmat в Python v / s MATLAB

1

Для данной матрицы я вычитаю максимум каждой строки из строки. В 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])) но безуспешно!

Где именно я упускаю? Большое спасибо.

Теги:

1 ответ

1
Лучший ответ

В 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]
  • 0
    На этой же ноте я пытаюсь поэлементно разделить матрицу на две матрицы 3x2. У меня есть X = np.divide (np.exp (Xm), np.sum (np.exp (Xm), axis = 1)), 1-й аргумент - 3x2, 2-й - 3x1, и я хочу, чтобы X также был 3x2 (2-й аргумент повторяется для формирования матрицы 3х2)
  • 0
    @Deepayan: np.sum похож на np.max , вы можете добавить аргумент keepdims=True . Тогда дивизия сможет вещать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню