Python nan со сложными массивами - PullRequest
0 голосов
/ 06 февраля 2019

Вставка nan в Python в сложный массив numpy дает неожиданное (для меня) поведение:

a = np.array([5+6*1j])
print a
array([5.+6.j])

a[0] = np.nan
print a
array([nan+0.j])

Я ожидал, что Python напишет nan+nanj. Для анализа это часто может не иметь значения, посколькуnp.isnan любого комплекса с действительными и / или мнимыми частями - Истина.Тем не менее, я не знал о поведении, и при построении реальной и мнимой частей моего массива у меня сложилось впечатление, что у меня есть информация о мнимой (однако ее нет).Обходной путь должен написать a[0] = np.nan + np.nan*1j.Может кто-нибудь объяснить мне причину такого поведения?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вероятно, это связано с представлением num:

NumPy использует стандарт IEEE для двоичной с плавающей точкой для арифметики (IEEE 754).Это означает, что «Не число» не эквивалентно бесконечности.

По существу np.nan - это float.Установив x[0] = np.nan, вы устанавливаете его значение в «реальное» значение с плавающей точкой (но не изменяете dtype массива, который остается сложным), поэтому мнимая часть остается неизменной как 0j.

Это также объясняет, почему вы можете изменить мнимую часть, выполнив np.nan * 0j

0 голосов
/ 06 февраля 2019

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

a = np.array([5+6*1j])

Вы создали массив dtype complex:

a.dtype
# dtype('complex128')

Итак, добавивзначение, которое содержит только действительную часть, оно будет преобразовано в комплексное значение, и поэтому вы будете вставлять число со сложным компонентом, равным 0j, поэтому:

np.complex(np.nan)
# (nan+0j)

Что объясняет поведение:

a[0] = np.array([np.nan])
print(a)    
# [nan+0.j]
...