умножение матриц-матриц вызывает странную ошибку - PullRequest
0 голосов
/ 24 января 2019

Неожиданно произойдет следующее:

# in a loop
.
try:
    pressure_book[element] = c @ np.matrix([1] + point).T
except TypeError as e:
    print(c, type(c), d.type)
    print(point, type(point))
    raise e
.
.

И выводит:

[[-1.52088384e+08  5.39161089e+03  9.08576658e+03 -3.23303777e-01]] <class 'numpy.matrixlib.defmatrix.matrix'> float64
[26088.6210156483, 17551.050000000003, 457882691.876694] <class 'list'>
Traceback (most recent call last):
  File "C:/Users/evkouni/Desktop/PythonGIT/trials.py", line 111, in <module>
    raise e
  File "C:/Users/evkouni/Desktop/PythonGIT/trials.py", line 106, in <module>
    pressure_book[element] = c @ np.matrix([1] + point).T
TypeError: Object arrays are not currently supported

Однако, когда я пробую значения в консоли, все работает нормально.

>>> c = np.matrix([[-1.52088384e+08, 5.39161089e+03, 9.08576658e+03, -3.23303777e-01]])
>>> point = [26088.6210156483, 17551.050000000003, 457882691.876694]
>>> c @ np.matrix([1] + point).T
matrix([[849.00029883]])

Любые идеи, что может быть причиной этого?

РЕДАКТИРОВАТЬ: кажется, np.matrix([1] + point).dtype возвращает object после пары итераций float64


В случае, если это уместно, я запускаю это, используя Python 3.5, numpy 1.15.4 из PyCharm 2018.3

1 Ответ

0 голосов
/ 25 января 2019

Кажется, что в зависимости от того, что содержит 1 point, преобразование в numpy.matrix с неопределенным dtype может дать object.

object - dtype массивы \ матрицы не поддерживают умножение матриц.

Чтобы решить эту проблему, необходимо указать dtype:

c @ np.matrix([1] + point, dtype='float64').T

Кроме того, numpy утверждает, что использование класса numpy.matrix не рекомендуется, и вместо него следует использовать numpy.array.

Примечание

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

Взято с здесь


1 numpy состояния: "Если не указан [dtype], тип будет определен как минимальный тип, необходимый для хранения объектов в последовательности."

...