Как эффективно округлить только один столбец массива numpy до ближайшего 0,5? - PullRequest
1 голос
/ 28 июня 2019

Есть ли эффективный способ округления только одного столбца массива numpy?Т.е. я хочу, чтобы числа округлялись до ближайшего 0,5, что можно сделать с помощью round(number * 2.0) / 2.0.

. Предположим, у меня есть массив numpy tmp, и я стремлюсь округлить третий столбец.Я попробовал следующие вещи:

  1. Для округления до определенного десятичного знака я мог бы использовать
tmp[:,2] = np.around(tmp[:,2],1)

Но это не то, что я хочу.

Я определяю функцию и пытаюсь применить вдоль оси:
def roundToHalf(number):
   return round(number * 2.0) / 2.0

tmp[:,2] = np.apply_along_axis(roundToHalf,0,tmp[:,2])

или

tmp[:,2] = roundToHalf(tmp[:,2])

Это не работает, потому что я получаю ошибку:

*** TypeError: type numpy.ndarray doesn't define __round__ method

В худшем случае я бы просто использовал цикл for.Но я надеюсь, что вы, ребята, поможете мне найти более плавное решение.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Проблема в том, что вы написали функцию для обработки одного числа, а не массива. Вы можете использовать numpy's вокруг , чтобы округлить весь массив. Ваша функция будет тогда

import numpy as np
def roundToHalf(array):
   return np.around(array * 2.0) / 2.0

и если вы введете пустой массив, он должен работать. Пример ниже

In [24]: roundToHalf(np.asarray([3.6,3.8,3.3,3.1]))
Out[24]: array([3.5, 4. , 3.5, 3. ])
0 голосов
/ 28 июня 2019

Вы можете применить np.vectorize() к вашей функции roundToHalf(), чтобы ее можно было применить к массиву пустышек

roundToHalf_vect = np.vectorize(roundToHalf)
tmp[:,2] = roundToHalf_vect(tmp[:,2])
...