Я читал, что 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
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 для других стилей округления
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