Я читал этот код для реализации линейной регрессии с нуля:
# convert from data frames to numpy matrices
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))
Когда я наткнулся на эту строку:
np.matrix(np.array([0,0]))
Мне было интересно, почему человек просто не написал np.matrix([0,0])
.
Я запустил оба в блокноте jupyter и получил тот же результат:
theta = np.matrix([0,0])
theta2 = np.matrix(np.array([0,0]))
print(theta,theta2,type(theta),type(theta2))
Выход:[[0 0]] [[0 0]] <class 'numpy.matrix'> <class 'numpy.matrix'>
Есть ли разница между ними? Добавляет ли дополнительная np.array
часть функциональности тета? Будет ли окончательный код работать правильно, если я заменю первый вторым?
Вы можете проверить документация:
Подпись «данные» np.matrix
может быть либо array_like, либо строкой, при этом достаточно как [0,0], так и соответствующего numpy.ndarray
аналога.
Как ни странно, matrix(array([0,0]))
создает чистый объект, которому принадлежат его данные.
>>> np.matrix(np.array([0,0])).flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> np.matrix(np.array([0,0])).base
тогда как matrix([0,0])
кажется представлением анонимного массива.
>>> np.matrix([0,0]).flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> np.matrix([0,0]).base
array([0, 0])
Таким образом, дополнительное array
в matrix(array(..))
, кажется, позволяет избежать беспорядка, хотя более глубокие причины этого остаются для меня загадочными.
np.matrix
имеет параметр copy=True
, np.asmatrix
имеет значение False по умолчанию. matrix.__new__
возвращает ввод ndarray
в соответствии с этой копией (вместе с окончательной настройкой формы). Другой data
прошел через np.array(data, ...)
, за которым последовал звонок ndarray.__new__
. Подробнее см. в коде numpy/matrixlib/defmatrix.py.
По сути, оба используют np.array
, чтобы превратить список в массив. Остальное просто приводит этот массив в подкласс matrix
. Начиная с большого списка, я не вижу существенных различий во времени (даже по сравнению с обычным np.array(alist)
.). Мы также можем использовать `arr.view(np.matrix)``.
Это было написано в 2014 году. Теперь у
np.matrix
есть PendingDepricationWarning. Я ожидаю, что автор демо просто использовал стиль кодирования, к которому он привык, без тонкой настройки от группы читателей SO.