Установите очень низкие значения на ноль в numpy - программирование
Подтвердить что ты не робот

Установите очень низкие значения на ноль в numpy

В numpy у меня есть массив вроде

[0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j] 

какой самый быстрый и простой способ установить супер низкое значение в ноль, чтобы получить

[0 +  0.5j, 0.25 + 0j, 0.25+ 0j, 0 + 0j] 

эффективность не является первостепенной.

4b9b3361

Ответ 1

Хммм. Я не очень доволен этим, но это, похоже, работает:

>>> a = np.array([0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j])
>>> a
array([  0.00000000e+00 +5.00000000e-01j,
         2.50000000e-01 +1.23524440e-24j,
         2.50000000e-01 +0.00000000e+00j,   2.46519033e-32 +0.00000000e+00j])
>>> tol = 1e-16
>>> a.real[abs(a.real) < tol] = 0.0
>>> a.imag[abs(a.imag) < tol] = 0.0
>>> a
array([ 0.00+0.5j,  0.25+0.j ,  0.25+0.j ,  0.00+0.j ])

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

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

но он зависит от проблемы.

Ответ 2

Чтобы установить элементы, которые меньше eps, равны нулю:

a[np.abs(a) < eps] = 0

Там может быть более специализированная функция.

Если вы хотите подавить печать небольших поплавков:

import numpy as np
a = np.array([1+1e-10j])
print a # -> [ 1. +1.00000000e-10j]

np.set_printoptions(suppress=True)
print a # -> [ 1.+0.j]

Ответ 3

Вы также можете использовать метод numpy.isclose:

>>> np.isclose([1e10,1e-7], [1.00001e10,1e-8])
array([True, False])

Если спросить, близок ли он к нулю, он должен работать:

>>> np.isclose([1e10,0], [1.00001e-10,0])
array([False, True])

Вы можете настроить atol (абсолютный допуск, по умолчанию - 1e-08) и параметры rtol (относительный допуск, по умолчанию 1e-05). Затем вы можете установить rtol=0 только для абсолютного допуска.

Ответ 4

Если все числа имеют маленькие мнимые части, и вы хотите только подавить их, тогда вы можете использовать

b=np.real_if_close(a)

В противном случае предложение DSM - это путь вперед, т.е.

a.real[abs(a.real)<1e-13]=0
a.imag[abs(a.imag)<1e-13]=0

Ответ 5

Используя метод round (n) массива

np.array( [0 +  0.5j, 0.25 + 1.2352444e-24j, 
           0.25+ 0j, 2.46519033e-32 + 0j]  ).round(23)

Ответ 6

diff = x-y
diff[diff>1.e-16]

Out[93]:
array([], dtype=float64)

diff[diff>1.e-18]

array([1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
       1.73472348e-18])