скалярное произведение двумерного массива и одномерного массива отличается от матрицы и одномерного массива - PullRequest
3 голосов
/ 11 октября 2019

Я использовал функцию numpy dot для вычисления произведения 2D и 1D массива. Я заметил, что когда 2D-массив имеет тип matrix , а 1D-массив имеет тип ndarray , результат, возвращаемый функцией dot, отличается от того, когда я его передаю2D массив типа ndarray.

Вопрос : Почему результаты отличаются?

Краткий пример

import numpy as np
a=[[1,2],
   [3,4],
   [5,6]]
e=np.array([1,2])
b=np.array(a)
print("Ndarrray:%s"%(type(b)))
print(b)
print("Dim of ndarray %d"%(np.ndim(b)))
be=np.dot(b,e)
print(be)
print("Dim of array*array %d\n"%(np.ndim(be)))

c=np.mat(a)
print("Matrix:%s"%(type(c)))
print(c)
print("Dim of matrix %d"%(np.ndim(c)))
ce=np.dot(c,e)
print(ce)
print("Dim of matrix*array %d"%(np.ndim(ce)))
Ndarrray:<class 'numpy.ndarray'>
[[1 2]
 [3 4]
 [5 6]]
Dim of ndarray 2
[ 5 11 17]
Dim of array*array 1

Matrix:<class 'numpy.matrix'>
[[1 2]
 [3 4]
 [5 6]]
Dim of matrix 2
[[ 5 11 17]]
Dim of matrix*array 2

1 Ответ

4 голосов
/ 11 октября 2019

Прежде всего, для класса матрицы:

Примечание:
Больше не рекомендуется использовать этот класс, даже для линейной алгебры. Вместо этого используйте обычные массивы. Класс может быть удален в будущем.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html

Это потому, что первый элемент в точечном произведении имеет матричный тип, и, следовательно, вы получаете матрицу в качестве вывода. Но если вы используете shape method, чтобы получить «реальный» размер вашей матрицы, вы получите согласованный результат:

import numpy as np
a=[[1,2],
   [3,4],
   [5,6]]
e=np.array([1,2])
b=np.array(a)
print("Ndarrray:%s"%(type(b)))
print(b)
print("Dim of ndarray %d"%(np.ndim(b)))
be=np.dot(b,e)
print(be)
print("Dim of array*array %d\n"%(np.ndim(be)))

c=np.mat(a)
print("Matrix:%s"%(type(c)))
print(c)
print("Dim of matrix %d"%(np.ndim(c)))
ce=np.dot(c,e)
print(ce)
print("Dim of matrix*array %d"%(np.ndim(ce))) 
print("Dim of matrix*array ",(ce.shape)) # -> ('Dim of matrix*array ', (1, 3))
print(type(ce)) # <class 'numpy.matrixlib.defmatrix.matrix'>

У вас есть матрица формы (1,3), которая на самом деле является вектором (dim 1, потому что у вас есть 1 строка и 3 столбца)

По сути, чтобы получить размеры экземпляра матрицы, вы должны использовать shape, а не ndim

Чтобы сделать его более понятным,если вы определяете пустую матрицу, вы получаете по умолчанию всегда 2 дим:

c=np.mat([])
print(c.ndim) # 2

Возможно, это было задумано таким образом, потому что мы начинаем говорить о матрице, когда у нас есть по крайней мере 2 дим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...