Numpy: np.floor_divide молча отбрасывает мнимую часть

Созданный на 1 апр. 2019  ·  13Комментарии  ·  Источник: numpy/numpy

Воспроизведение примера кода:

import numpy as np
a = np.arange(10) + 1j* np.arange(10)
a
# array([0.+0.j, 1.+1.j, 2.+2.j, 3.+3.j, 4.+4.j, 5.+5.j, 6.+6.j, 7.+7.j,
#           8.+8.j, 9.+9.j])
a / 2
# array([0. +0.j , 0.5+0.5j, 1. +1.j , 1.5+1.5j, 2. +2.j , 2.5+2.5j,
#          3. +3.j , 3.5+3.5j, 4. +4.j , 4.5+4.5j])
a // 2
# array([0.+0.j, 0.+0.j, 1.+0.j, 1.+0.j, 2.+0.j, 2.+0.j, 3.+0.j, 3.+0.j,
#          4.+0.j, 4.+0.j])

Есть ли особая причина такого поведения? Я ожидал, что floor_divide воображаемая и сложная часть.

Сообщение об ошибке:

Никаких ошибок или предупреждений не возникает, даже эта воображаемая часть не теряется.

Информация о версии Numpy / Python:

1.16.1
3.6.7 (по умолчанию, 22 октября 2018 г., 11:32:17)
[GCC 8.2.0]

00 - Bug 15 - Discussion numpy.ufunc

Все 13 Комментарий

Вы не можете использовать функцию пола для комплексных чисел.
Этаж комплексных чисел
Также мы не разделяем мнимую часть и сложную часть отдельно. При делении двух комплексных чисел мы получаем одно комплексное число. ( Деление комплексных чисел )

Также ,
`>>> (1. + 1.j) // 2

Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: невозможно получить комплексное число.

Аналогичным образом он должен показать TypeError .
Я новичок в открытом исходном коде. Я бы хотел это сделать. Может ли кто-нибудь направить меня?

Numpy не может обрабатывать комплексные числа, поэтому вместо того, чтобы выдавать ошибку, он просто отбрасывает мнимую часть. Поэтому я думаю, что Numpy работает хорошо.

Ладно, подумал, стоит хотя бы предупредить, что мнимая часть отброшена, как и другие функции.

Обычный питон выдает ошибку, кажется, нам, вероятно, следует последовать его примеру, если кто-то не может придумать вариант использования?

Да, я думаю, нам следует выбросить TypeError.
Могу я поработать над этим?

Лично я бы даже предпочел (2 + 2j) // 2 = (1 + 1j), хотя это не совсем математически правильно.

Не уверен, что лучше, остаток просто не реализован для сложных (выдает ошибку). И если мы перейдем к ошибке, возможно, нам сначала следует отказаться от поддержки.

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

«Перед лицом двусмысленности откажитесь от соблазна угадать». предполагает, что это должно быть TypeError .

@ kaivu1999 - для решения этой проблемы, вероятно, лучше всего будет удалить сложные типы, даже если они генерируются в floor_divide ufunc (обратите внимание, что divmod , remainder и modf уже в порядке). Посмотрите в core/src/umath/loops.c.src , в материале после строки 2321 (вероятно, просто удалите строки 2480--2500).

@mhvk да, вам также нужно настроить numpy/core/code_generators/generate_umath.py , но если мы хотим сначала отказаться от поддержки, вам, вероятно, придется создать преобразователь настраиваемого типа (дополнительно касается numpy/core/src/umath/ufunc_type_resolution.c ).

@seberg - кажется, что текущее поведение действительно следует рассматривать как ошибку, и что для согласованности с remainder и divmod мы должны начать выдавать ошибку.

Хотим ли мы другого поведения, это отдельный разговор.

Да, я в этом.
Я изменил код, и теперь он показывает:
`>>> a // 2

Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: ufunc 'floor_divide' не поддерживается для входных типов, и входные данные не могут быть безопасно приведены к каким-либо поддерживаемым типам в соответствии с правилом литья '' safe '
`
Сгенерировать запрос на перенос?

@ kaivu1999 запрос на Fixes #13236 в первый комментарий, в котором будет ссылка на проблему и PR.

Деление этажа на действительную и мнимую части имеет определенный смысл, если мы задокументируем, что результатом являются гауссовские целые числа. Однако это не соответствовало бы Python.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

navytux picture navytux  ·  4Комментарии

astrofrog picture astrofrog  ·  4Комментарии

kevinzhai80 picture kevinzhai80  ·  4Комментарии

dmvianna picture dmvianna  ·  4Комментарии

perezpaya picture perezpaya  ·  4Комментарии