Как всегда округлить XX.5 в NumPy

1

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

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

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

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

  • 0
    Какое поведение вы хотите для отрицательных чисел? Должно ли -2,5 округлить до -3,0 или до -2,0?
  • 0
    Это хороший вопрос, хотя в моем сценарии нет отрицательных чисел, так что я действительно не думал об этом
Теги:
numpy
rounding

2 ответа

2
Лучший ответ
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 для других стилей округления

  • 0
    np.ceil всегда будет округлять его. Я все еще хочу, чтобы 1,3 округлилось до 1, а 1,5 - до 2. Может быть, это не было ясно в моем вопросе, извините
  • 0
    Если это так, то нет функции для этого в numpy. Что вы можете сделать, так это перебрать все элементы и проверить, нет ли на них округления
Показать ещё 1 комментарий
1
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]])

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

  • 0
    по какой-то причине я получаю сообщение об ошибке, когда я передаю десятичное число в customround. Ответ Андреаса, кажется, работает нормально, даже если вы упомянули сначала использование np.vectorize: P. Спасибо, хотя, я не знал о np.vectorize

Ещё вопросы

Сообщество Overcoder
Наверх
Меню