Как установить точность имен столбцов, созданных с помощью np.arange ()? - PullRequest
0 голосов
/ 11 июня 2019

Я сделал dataframe и установил имена столбцов, используя np.arange(). Однако вместо точных чисел он (иногда) устанавливает их в числа, подобные 0.300000004.

Я пытался как округлить весь фрейм данных, так и использовать np.around() для вывода np.arange(), но ни один из них, похоже, не работает. Я также попытался добавить это вверху:

np.set_printoptions(suppress=True)
np.set_printoptions(precision=3)

Вот инструкция возврата моей функции:

stepT = 0.1
%net is some numpy array
return pd.DataFrame(net, columns = np.arange(0,1+stepT, stepT),
                    index = np.around(np.arange(0,1+stepS,stepS),decimals = 3)).round(3)

Есть ли какая-нибудь функция, которая позволит мне иметь эти имена в виде чисел, состоящих только из одной цифры после запятой?

1 Ответ

0 голосов
/ 11 июня 2019

Кажущаяся неточность чисел с плавающей точкой возникает часто.

In [689]: np.arange(0,1+stepT, stepT)                                                                  
Out[689]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
In [690]: _.tolist()                                                                                   
Out[690]: 
[0.0,
 0.1,
 0.2,
 0.30000000000000004,
 0.4,
 0.5,
 0.6000000000000001,
 0.7000000000000001,
 0.8,
 0.9,
 1.0]
 In [691]: _689[3]                                                                                      
 Out[691]: 0.30000000000000004

Параметры печати Numpy управляют отображением массивов. но они не действуют при печати отдельных значений.

Когда я делаю фрейм данных с этой спецификацией столбца, я получаю хороший дисплей. (_689 является сокращением ipython для массива Out[689].) Он использует форматирование массива:

In [699]: df = pd.DataFrame(np.arange(11)[None,:], columns=_689)                                       
In [700]: df                                                                                           
Out[700]: 
   0.0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.0
0    0    1    2    3    4    5    6    7    8    9   10
In [701]: df.columns                                                                                   
Out[701]: 
Float64Index([                0.0,                 0.1,                 0.2,
              0.30000000000000004,                 0.4,                 0.5,
               0.6000000000000001,  0.7000000000000001,                 0.8,
                              0.9,                 1.0],
             dtype='float64')

Но выбрать столбцы с плавающими так сложно. Некоторые работают, некоторые нет.

In [705]: df[0.4]                                                                                      
Out[705]: 
0    4
Name: 0.4, dtype: int64

In [707]: df[0.3]                                                                                      
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)

Похоже, он выполняет поиск по словарю. Поплавки не подходят для этого из-за присущей им неточности.

Выполнение теста на равенство arange:

In [710]: _689[3]==0.3                                                                                 
Out[710]: False
In [711]: _689[4]==0.4                                                                                 
Out[711]: True

Я думаю, вам следует создать список правильно отформатированных строк из arange и использовать его в качестве заголовков столбцов, а не самих плавающих элементов.

Например:

In [714]: alist = ['%.3f'%i for i in _689]                                                             
In [715]: alist                                                                                        
Out[715]: 
['0.000',
 '0.100',
 '0.200',
 '0.300',
 '0.400',
 '0.500',
 '0.600',
 '0.700',
 '0.800',
 '0.900',
 '1.000']
In [716]: df = pd.DataFrame(np.arange(11)[None,:], columns=alist)                                      
In [717]: df                                                                                           
Out[717]: 
   0.000  0.100  0.200  0.300  0.400  0.500  0.600  0.700  0.800  0.900  1.000
0      0      1      2      3      4      5      6      7      8      9     10
In [718]: df.columns                                                                                   
Out[718]: 
Index(['0.000', '0.100', '0.200', '0.300', '0.400', '0.500', '0.600', '0.700',
       '0.800', '0.900', '1.000'],
      dtype='object')
In [719]: df['0.300']                                                                                  
Out[719]: 
0    3
Name: 0.300, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...