Почему индексация этой матрицы Numpy вызывает ошибку? - PullRequest
0 голосов
/ 19 апреля 2019

Я использую:

  • Python 3.5.4
  • Numpy 1.16.2

С учетом кода:

import numpy as np
num = 3
a = np.asmatrix(np.eye(num, num))
b = np.asmatrix(range(0, num))
print(a[b].transpose())

Я получаю результат:

[[1.00000000e+000 0.00000000e+000 0.00000000e+000]
 [1.77658241e-307 0.00000000e+000 0.00000000e+000]
 [3.47328271e-310 0.00000000e+000 0.00000000e+000]]

Но, либо изменив определение b на np.asarray(...), либо выполнив второе индексирование, чтобы получить первый элемент в списке (print(a[b][0].transpose()) Iполучить ожидаемый результат:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

Что происходит?Я не сталкивался с этой ошибкой, прежде чем понятия не имею о причинах.Если это что-то фундаментальное для Python (я все еще новичок в этом деле), я бы очень хотел узнать об этом, чтобы не тратить столько времени на отладку, как в этот раз.Большое спасибо заранее.

1 Ответ

1 голос
/ 19 апреля 2019

NumPy matrix объекты пытаются гарантировать, что они всегда 2D, но они не совсем выполняют свою работу.

Когда вы делаете

b = np.asmatrix(range(0, num))

range(0, num) - это одномерная последовательность, но asmatrix создает однорядную 2D-матрицу вместо 1D-объекта. asarray даст массив 1D.

Когда вы делаете

a[b]

Это необычная операция индексации, которая создает матрицу 3D . numpy.matrix объекты никогда не должны быть трехмерными, и следующие transpose не знают, как с этим справиться, что приводит к бессмысленным результатам. В частности, из-за ошибки округления странные числа, почти равные 0, на выходе равны , а не ; они происходят из-за бессмысленных шагов результирующей матрицы, которые приводят к неравномерному доступу к памяти и пытаются прочитать фрагменты отдельных операций с плавающей запятой как один процесс:

In [13]: a[b].transpose().strides
Out[13]: (1, 24)

Это шаг в 1 байт в первом измерении.


Ключ на вынос здесь: не используйте numpy.matrix.

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