2016-07-27 2 views
0

Я понимаю, что точность элемента float массива NumPy ограничена машиной epsilon.Прецизионность: массив объектов NumPy против Float Array

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

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

import numpy as np 

np.set_printoptions(precision=64) 

MyArray = np.empty(2) 
MyArray.fill(0.442) 
print(MyArray) 

# [ 0.442000000000000003996802888650563545525074005126953125 
# 0.442000000000000003996802888650563545525074005126953125] 

MyArray_precise = np.empty(2, dtype = object) 
MyArray_precise.fill(0.442) 
print(MyArray_precise) 

# [0.442 0.442] 

У меня установлена ​​32-разрядная установка Python 2.7.12 на 64-разрядной Windows.

ответ

3

Это только вопрос форматирования отображения, который вы видите. На самом деле вы не получаете более точного числа в любом случае; это только то, что установленный вами параметр отображения precision=64 не применяется к массивам объектов. Он применяется только к массивам с плавающей точкой.

Если вы печатаете больше цифр содержание MyArray_precise:

print(format(MyArray_precise[0], '.64')) 
# 0.442000000000000003996802888650563545525074005126953125 

вы увидите, что это на самом деле не лучше, чем другой массив.

0

Я согласен с тем, что проблема с поплавками - это вопрос отображения, а не точности.

Но есть и другая проблема с длинными целыми числами. Python имеет длинный целочисленный тип, который не имеет dtype numpy.

In [87]: x=12312312312311231231241241242342 
In [88]: x 
Out[88]: 12312312312311231231241241242342 

Это Py3. Py2 показывает его как 12312312312311231231241241242342L

In [90]: np.array([x]) 
Out[90]: array([12312312312311231231241241242342], dtype=object) 
In [91]: np.array([x],int) 
.... 
OverflowError: Python int too large to convert to C long 
Смежные вопросы