Как всегда округлить XX.5 в NumPy - PullRequest
0 голосов
/ 08 ноября 2018

Я читал, что numpy беспристрастен в округлении и работает так, как задумано.Это «если вы всегда округляете 0,5 до следующего наибольшего числа, то среднее число округленных чисел, скорее всего, будет немного больше, чем среднее число неокругленных чисел: это смещение или дрейф может иметь очень плохие последствия для некоторых численных алгоритмов исделать их неточными. "

Не обращая внимания на эту информацию и предполагая, что я всегда хочу округлить, как я могу сделать это в numpy?Предполагая, что мой массив может быть довольно большим.

Для простоты, давайте предположим, что у меня есть массив:

import numpy as np

A = [ [10, 15, 30], [25, 134, 41], [134, 413, 51]]
A = np.array(A, dtype=np.int16)

decimal = A * .1
whole = np.round(decimal)

десятичный выглядит так:

[[  1.    1.5   3. ]
 [  2.5  13.4   4.1]
 [ 13.4  41.3   5.1]]

целом выглядит так:

[[  1.   2.   3.]
 [  2.  13.   4.]
 [ 13.  41.   5.]]

Как видите, 1,5 округлили до 2, а 2,5 также округлили до 2. Как я могу заставить всегда получать округленный ответ для XX.5?Я знаю, что могу перебрать массив и использовать python round (), но это определенно будет намного медленнее.Интересно, есть ли способ сделать это, используя функции numpy

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
In [25]: def yourroundfunction(number):
    ...:     if(int(number)+0.5<=number):
    ...:         number=int(number)+1
    ...:     else:
    ...:         number=int(number)
    ...:     return number
    ...: 
    ...: 

In [26]:     
In [26]: customround=np.vectorize(yourroundfunction)

In [27]: customround(A)
Out[27]: 
array([[ 1,  2,  3],
       [ 3, 13,  4],
       [13, 41,  5]])

Хорошо, вы можете определить функцию произвольного окружения, а затем передать ее в np.vectorize и затем получить ожидаемый результат. Я написал эту пользовательскую функцию, потому что вызов round в ipython не работает точно так же, как в python

.
0 голосов
/ 08 ноября 2018
import numpy as np
A = [ [1.0, 1.5, 3.0], [2.5, 13.4, 4.1], [13.4, 41.3, 5.1]]
A = np.array(A)

print(A)

def rounder(x):
    if (x-int(x) >= 0.5):
        return np.ceil(x)
    else:
        return np.floor(x)

rounder_vec = np.vectorize(rounder)
whole = rounder_vec(A)
print(whole)

Кроме того, вы также можете посмотреть numpy.ceil , numpy.floor , numpy.trunc для других стилей округления

...