Функция 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.])