Синтаксис Python numpy проще?

#python #matlab #numpy

#python #matlab #numpy

Вопрос:

Я новичок в numpy, и меня уже немного тошнит от его синтаксиса.

Что-то, что можно было бы написать подобным образом в Octave / matlab

 1/(2*m) * (X * theta - y)' * (X*theta -y)
  

Становится ли это в numpy

 np.true_divide(((X.dot(theta)-y).transpose()).dot((X.dot(theta)-y)),2*m)
  

Мне намного сложнее писать и отлаживать. Есть ли лучший способ написать матричные операции, подобные приведенным выше, чтобы упростить жизнь?

Комментарии:

1. В отличие от Java, вы можете перегружать операторы в Python. Не знаком с numpy в частности, но, возможно, вы можете расширить тип данных, с которым вы работаете, и внедрить в него методы перегрузки операторов.

2. Не связанный с проблемами синтаксиса, вероятно, стоит вычислять X*theta - y отдельно и использовать значение дважды вместо его повторного вычисления.

3. @user2357112 да. хороший момент.

4. FWIW: В отличие от matlab, numpy это просто пакет на языке программирования общего пользования. Поэтому неудивительно, что его синтаксис не такой «математический», как у matlab…

5. @Santa: numpy уже перегружает операторы, чтобы разрешить поэлементные операции, но не предоставляет оператора для умножения матриц, в основном потому, что операторов недостаточно для обхода. ( * должно означать либо поэлементное, либо матричное умножение, и для массивов numpy они решили сделать так, чтобы это означало первое.)

Ответ №1:

Вы можете внести некоторые упрощения. При использовании from __future__ import division в начале вашей программы все деления автоматически будут «истинными», поэтому вам не нужно будет использовать true_divide . (В Python 3 вам даже не нужно этого делать, поскольку истинное деление автоматически устанавливается по умолчанию.) Кроме того, вы можете использовать .T вместо .transpose() . Затем ваш код становится

 1/(2*m) * ((X.dot(theta) - y).T).dot((X.dot(theta) - y))
  

что немного лучше.

В Python 3.5 добавляется новый оператор умножения матриц @ в основном именно по этой причине. Это еще не выпущено, но когда это будет сделано (и когда numpy будет обновлен, чтобы использовать его), ваш код станет очень похож на версию Octave:

 1/(2*m) * (X@theta - y).T @ (X@theta - y)
  

Ответ №2:

Вы могли бы попробовать использовать np.matrix вместо np.ndarray для двумерных массивов. Он перегружает * оператор так, что это означает умножение матрицы, поэтому вы можете избавиться от всех .dot s. Вот документы.

Ответ №3:

Есть способ получше, но вам придется обратиться к документации numpy, чтобы найти его.

На этой странице перечислено множество эквивалентностей между matlab и numpy с более простым синтаксисом. Например, a.transpose() может быть записан как a.T .

Вы также можете посмотреть отдельную документацию для этих функций, например, для, true_divide в которой объясняется, что метод Python 3 / работает для выполнения того же самого.