Неожиданное поведение numpy .real_if_close по сравнению с numpy .real, numpy .imag - PullRequest
0 голосов
/ 21 февраля 2020

Я пробираюсь через scipy tutorial , и я столкнулся с поведением функции numpy .real_if_close, которое мне не совсем понятно:

b = np.array([1+1j, 2+1j, 3+1j, 4+5e-15j])
b
>>>[1.+1.e+00j 2.+1.e+00j 3.+1.e+00j 4.+5.e-15j]

np.real(b)
>>>[1. 2. 3. 4.]
b.real
>>>[1. 2. 3. 4.]

np.imag(b)
>>>[0. 0. 0. 5.]
b.imag
>>>[0. 0. 0. 5.]

np.finfo(float).eps
>>>2.220446049250313e-16

b # <-- to make sure I didn't change b
>>>[1.+1.e+00j 2.+1.e+00j 3.+1.e+00j 4.+5.e-15j]

np.real_if_close(b, tol=1000) # <-- does not perform the approx 4+5e-14j ~= 4
>>>[1.+1.e+00j 2.+1.e+00j 3.+1.e+00j 4.+5.e-15j]
b.real_if_close(tol=1000) # <-- raises an AttributeError
>>>AttributeError: 'numpy.ndarray' object has no attribute 'real_if_close'

np.real_if_close([2.1 + 4e-14j], tol=1000) # <-- example from the tutorial
>>>[2.1]

From документация real_if_close , real и imag параметры трех функций описаны одинаково, поэтому я немного растерялся в их различном поведении с уважение к тому же объекту.

  • Я предполагаю, что здесь что-то не так?
  • Стоит ли сообщать о проблеме?

1 Ответ

1 голос
/ 21 февраля 2020

Функция real_if_close будет преобразовывать массив в реальный, только если все элементы имеют мнимую часть, близкую к нулю.

Ваш b.imag на самом деле:

array([1.e+00, 1.e+00, 1.e+00, 5.e-15])

Итак, первые три элемента - это 1, которые не достаточно близки к нулю ...

Если вы повторите это с массивом, где все элементы имеют мнимую часть, близкую к нулю, он будет работать, как и ожидалось:

b = np.array([1+0j, 2+1e-14j, 3-1e-15j, 4+5e-15j])

И np.real_if_close(b, tol=1000) Возвращает:

array([1., 2., 3., 4.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...