Функция Python, которая определяет, являются ли числа в списке или массиве ближе к 0 или 1

У меня есть numpy массив чисел. Ниже приведен пример:

[[-2.10044520e-04  1.72314372e-04  1.77235336e-04 -1.06613465e-04
6.76617611e-07  2.71623057e-03 -3.32789944e-05  1.44899758e-05
5.79249863e-05  4.06502549e-04 -1.35823707e-05 -4.13955189e-04
5.29862793e-05 -1.98286005e-04 -2.22829175e-04 -8.88758230e-04
5.62228710e-05  1.36249752e-05 -2.00474996e-05 -2.10090068e-05
1.00007518e+00  1.00007569e+00 -4.44597417e-05 -2.93724453e-04
1.00007513e+00  1.00007496e+00  1.00007532e+00 -1.22357142e-03
3.27903892e-06  1.00007592e+00  1.00007468e+00  1.00007558e+00
2.09869172e-05 -1.97610235e-05  1.00007529e+00  1.00007530e+00
1.00007503e+00 -2.68725642e-05 -3.00372853e-03  1.00007386e+00
1.00007443e+00  1.00007388e+00  5.86993822e-05 -8.69989983e-06
1.00007590e+00  1.00007488e+00  1.00007515e+00  8.81850779e-04
2.03875532e-05  1.00007480e+00  1.00007425e+00  1.00007517e+00
-2.44678912e-05 -4.36556267e-08  1.00007436e+00  1.00007558e+00
1.00007571e+00 -5.42990711e-04  1.45517859e-04  1.00007522e+00
1.00007469e+00  1.00007575e+00 -2.52271817e-05 -7.46339417e-05
1.00007427e+00]]

Я хочу знать, ближе ли каждое из чисел к 0 или 1. Есть ли в Python функция, которая может это сделать, или мне нужно делать это вручную?

Ответ 1

numpy.rint - это функция, которая округляет элементы массива до ближайшего целого числа.

>>> a = np.arange(0, 1.1, 0.1)
>>> a
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
>>> np.rint(a)
array([0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1.])

Что делать, если числа не должны быть между 0 и 1?

В этом случае я бы использовал numpy.where.

>>> a = np.arange(-2, 2.1, 0.1)
>>> a
array([-2.00000000e+00, -1.90000000e+00, -1.80000000e+00, -1.70000000e+00,
       -1.60000000e+00, -1.50000000e+00, -1.40000000e+00, -1.30000000e+00,
       -1.20000000e+00, -1.10000000e+00, -1.00000000e+00, -9.00000000e-01,
       -8.00000000e-01, -7.00000000e-01, -6.00000000e-01, -5.00000000e-01,
       -4.00000000e-01, -3.00000000e-01, -2.00000000e-01, -1.00000000e-01,
        1.77635684e-15,  1.00000000e-01,  2.00000000e-01,  3.00000000e-01,
        4.00000000e-01,  5.00000000e-01,  6.00000000e-01,  7.00000000e-01,
        8.00000000e-01,  9.00000000e-01,  1.00000000e+00,  1.10000000e+00,
        1.20000000e+00,  1.30000000e+00,  1.40000000e+00,  1.50000000e+00,
        1.60000000e+00,  1.70000000e+00,  1.80000000e+00,  1.90000000e+00,
        2.00000000e+00])
>>> np.where(a <= 0.5, 0, 1)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

Ответ 2

Простой способ:

lst=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]

closerTo1 = [x >= 0.5 for x in lst]

Или вы можете использовать np:

import numpy as np
lst=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]

arr = np.array(lst)
closerTo1 = arr >= 0.5

Обратите внимание, что >= 0.5 можно изменить на > 0.5, но вы решите его обработать.

Ответ 3

Вот один простой способ сделать это:

>>> a = np.arange(-2, 2.1, 0.1)
>>> (a >= .5).astype(np.float)
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,
        1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  1.])

(Измените np.float на np.int если хотите целые числа.)

Ответ 4

Вы можете использовать numpy.where:

import numpy as np

arr = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 2.0])
result = np.where(arr >= 0.5, 1, 0)
print(result)

Выход

[0 0 0 0 1 1 1 1 1 1]

Обратите внимание, что это вернет 1 для чисел выше 1 (например, 2).

Ответ 5

Вы можете использовать abs() чтобы измерить расстояния между вашим числом и 0 и 1 и проверить, какой из них короче.

x = [[-2.10044520e-04,  1.72314372e-04,  1.77235336e-04, -1.06613465e-04,
6.76617611e-07,  2.71623057e-03, -3.32789944e-05,  1.44899758e-05,
5.79249863e-05,  4.06502549e-04, -1.35823707e-05, -4.13955189e-04,
5.29862793e-05, -1.98286005e-04, -2.22829175e-04, -8.88758230e-04,
5.62228710e-05,  1.36249752e-05, -2.00474996e-05, -2.10090068e-05,
1.00007518e+00,  1.00007569e+00, -4.44597417e-05, -2.93724453e-04,
1.00007513e+00,  1.00007496e+00,  1.00007532e+00, -1.22357142e-03,
3.27903892e-06,  1.00007592e+00,  1.00007468e+00,  1.00007558e+00,
2.09869172e-05, -1.97610235e-05,  1.00007529e+00,  1.00007530e+00,
1.00007503e+00, -2.68725642e-05, -3.00372853e-03,  1.00007386e+00,
1.00007443e+00,  1.00007388e+00,  5.86993822e-05, -8.69989983e-06,
1.00007590e+00,  1.00007488e+00,  1.00007515e+00,  8.81850779e-04,
2.03875532e-05,  1.00007480e+00,  1.00007425e+00,  1.00007517e+00,
-2.44678912e-05, -4.36556267e-08,  1.00007436e+00,  1.00007558e+00,
1.00007571e+00, -5.42990711e-04,  1.45517859e-04,  1.00007522e+00,
1.00007469e+00,  1.00007575e+00, -2.52271817e-05, -7.46339417e-05,
1.00007427e+00]]

rounded_x = [0 if abs(i) < abs(1-i) else 1 for i in x[0]]
print(rounded_x)

Выход:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1]

Ответ 6

Здесь простое обобщение для любых произвольных чисел a и b, а не просто 0 и 1:

def closerab(l, a=0, b=1):
    l = np.asarray(l)
    boolarr = (np.abs(l - b) > np.abs(l - a))

    # returns two lists of indices, one for numbers closer to a and one for numbers closer to b
    return boolarr.nonzero()[0], (boolarr==0).nonzero()[0]

Это вернет два списка, один с индексами чисел ближе к a, а другой с индексами чисел ближе к b.

Тестирование это:

l = [
-2.10044520e-04, 1.72314372e-04, 1.77235336e-04, 1.06613465e-04,
6.76617611e-07, 2.71623057e-03, 3.32789944e-05, 1.44899758e-05,
5.79249863e-05, 4.06502549e-04, 1.35823707e-05, 4.13955189e-04,
5.29862793e-05, 1.98286005e-04, 2.22829175e-04, 8.88758230e-04,
5.62228710e-05, 1.36249752e-05, 2.00474996e-05, 2.10090068e-05,
1.00007518e+00, 1.00007569e+00, 4.44597417e-05, 2.93724453e-04,
1.00007513e+00, 1.00007496e+00, 1.00007532e+00, 1.22357142e-03,
3.27903892e-06, 1.00007592e+00, 1.00007468e+00, 1.00007558e+00,
2.09869172e-05, 1.97610235e-05, 1.00007529e+00, 1.00007530e+00,
1.00007503e+00, 2.68725642e-05, 3.00372853e-03, 1.00007386e+00,
1.00007443e+00, 1.00007388e+00, 5.86993822e-05, 8.69989983e-06,
1.00007590e+00, 1.00007488e+00, 1.00007515e+00, 8.81850779e-04,
2.03875532e-05, 1.00007480e+00, 1.00007425e+00, 1.00007517e+00,
-2.44678912e-05, 4.36556267e-08, 1.00007436e+00, 1.00007558e+00,
1.00007571e+00, 5.42990711e-04, 1.45517859e-04, 1.00007522e+00,
1.00007469e+00, 1.00007575e+00, 2.52271817e-05, 7.46339417e-05,
1.00007427e+00
]

print(closerab(l, 0, 1))

Это выводит:

(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 22, 23, 27, 28, 32, 33, 37, 38, 42, 43, 47, 48, 52, 53,
        57, 58, 62, 63]),
 array([20, 21, 24, 25, 26, 29, 30, 31, 34, 35, 36, 39, 40, 41, 44, 45, 46,
        49, 50, 51, 54, 55, 56, 59, 60, 61, 64]))

Ответ 7

В качестве альтернативы вы можете использовать троичный оператор.

x = [-0.2, 0.1, 1.1, 0.75, 0.4, 0.2, 1.5, 0.9]

a = 0
b = 1

[a if i <= (a+b)/2 else b for i in x]

Ответ 8

Из round(number[, ndigits]) встроенных функций Python round(number[, ndigits]):

Вернуть число с плавающей запятой, округленное до десятичных цифр после десятичной точки. Если ndigits не указан, по умолчанию используется ноль. Результатом является число с плавающей запятой. Значения округляются до ближайшего кратного 10 к степени минус цифра; если два множителя одинаково близки, округление выполняется вдали от 0 (например, round(0.5) равен 1.0 а round(-0.5) равен -1.0).

В частности, для numpy-массивов вы можете использовать функцию numpy.round_.

Ответ 9

Вы можете использовать round:

[round(i) for i in [0.1,0.2,0.3,0.8,0.9]]

Ответ 10

your_list=[[-2.10044520e-04, 1.72314372e-04, 1.77235336e-04, 1.06613465e-04,
6.76617611e-07, 2.71623057e-03, 3.32789944e-05, 1.44899758e-05,
5.79249863e-05, 4.06502549e-04, 1.35823707e-05, 4.13955189e-04,
5.29862793e-05, 1.98286005e-04, 2.22829175e-04, 8.88758230e-04,
5.62228710e-05, 1.36249752e-05, 2.00474996e-05, 2.10090068e-05,
1.00007518e+00, 1.00007569e+00, 4.44597417e-05, 2.93724453e-04,
1.00007513e+00, 1.00007496e+00, 1.00007532e+00, 1.22357142e-03,
3.27903892e-06, 1.00007592e+00, 1.00007468e+00, 1.00007558e+00,
2.09869172e-05, 1.97610235e-05, 1.00007529e+00, 1.00007530e+00,
1.00007503e+00, 2.68725642e-05, 3.00372853e-03, 1.00007386e+00,
1.00007443e+00, 1.00007388e+00, 5.86993822e-05, 8.69989983e-06,
1.00007590e+00, 1.00007488e+00, 1.00007515e+00, 8.81850779e-04,
2.03875532e-05, 1.00007480e+00, 1.00007425e+00, 1.00007517e+00,
-2.44678912e-05, 4.36556267e-08, 1.00007436e+00, 1.00007558e+00,
1.00007571e+00, 5.42990711e-04, 1.45517859e-04, 1.00007522e+00,
1.00007469e+00, 1.00007575e+00, 2.52271817e-05, 7.46339417e-05,
1.00007427e+00]]

close_to_one_or_zero=[1 if x > 0.5 else 0 for x in your_list[0]]
close_to_one_or_zero
    [0, 0, 0, 0, 0,....... 1, 1, 1, 0, 0, 1]