Проблема в матрешке 2D @ 1D. - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь повернуть некоторые координаты в numpy, используя матрицу 2x2 P и координаты internal (сохраняются как np.array в строке).Тем не менее, я получаю странное поведение при расчете P @ internal.Код ниже воспроизводит поведение:

>>> import numpy as np
>>> a = np.array([1, 0], dtype=np.float)
>>> c, s = np.cos(np.pi), np.sin(np.pi)
>>> p = np.matrix([[c, s], [-s, c]])
>>> b = p @ a
>>> b
matrix([[-1.0000000e+00, -1.2246468e-16]])
>>> b.shape
(1, 2)
>>> b[0].shape
(1, 2)
>>> b[0][0].shape
(1, 2)
>>> b[0][0][0].shape
(1, 2)

Как видно, я не могу индексировать в матрицу, и у меня внезапно появляется дополнительное измерение в том, что должно быть одномерным массивом.В документации для numpy говорится: «Если второй аргумент - 1-D, он повышается до матрицы, добавляя 1 к ее измерениям. После умножения матрицы добавленная 1 удаляется».Однако я не вижу этого поведения, а просто вижу странную вложенную форму.

Почему это происходит?

1 Ответ

1 голос
/ 20 июня 2019

Как вы указали, b - это matrix. Это устаревший подкласс ndarray, который всегда 2D . Инициализация матрицы с вектором (N,) -элемента добавляет 1 к форме, превращая ее в столбец (N, 1), как и ожидалось. b[0] также матрица, но на этот раз это строка. Первая строка строки также является строкой, поэтому форма останется неизменной независимо от того, сколько раз вы обращаетесь к первой строке.

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

>>> b[0, 0]
-1.0

TL; DR

Не используйте matrix: он устарел и имеет проблемы / отсутствие поддержки. Вместо этого выполните p = np.array([[c, s], [-s, c]]), и вы увидите ожидаемое поведение.

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