Подсчет похожих элементов в списке чисел - PullRequest
1 голос
/ 13 февраля 2020

Во время каждого шага итерации в for-l oop я вычисляю массив, который выглядит как

test = array([-0.23401695, -0.3880519 , -0.38805333, -0.38755048, -0.20781614,
    -0.70836718, -0.38785778, -0.2346411 , -0.38757777, -0.38597846,
     0.74324752, -0.38802888, -0.38768468,  0.25609106, -0.38759492,
    -0.38601501,  0.12539226, -0.38780387,  0.53026535, -0.38773322,
    -0.16896715, -0.54030724, -0.2340172 ,  0.74325264,  0.47274894,
    -0.38797809, -0.38803523, -0.2237936 ,  0.85406766, -0.23401624,
    -0.38803279, -0.38800347, -0.38793145, -0.38761207, -0.38795527,
    -0.62081793, -0.38803845, -0.21677125, -0.38799521,  0.868606  ,
    -0.3880574 , -0.38598402,  0.74379804, -0.38792198, -0.2026838 ,
    -0.38805706, -0.38600679, -0.02927724,  0.46588779, -0.20076108])

Я хочу определить количество элементов в тесте массива, которые похожи, например, число элементов, которые выглядят как -0,38 .....

Я пробовал что-то

for i in test:
    counter = 0

    for j in test:
        if abs(i - j) < 10**(-2):
            counter += 1

    if counter > 20:
        elements = counter - 1   # -1 for the case i=j
        break


elements  # --> 25

, которое работает в предположении, что я могу оценить количество похожих элементов (если счетчик> 20).

Кто-нибудь знает, как это обобщить (без уловки _, если счетчик> 20 _, которая не будет работать во всех случаях).

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Если я правильно понимаю вопрос, вы можете получить количество похожих элементов, используя collections.Counter в сочетании с np.ndarray.round():

>>> test = np.array(...)
>>> Counter(test.round(2))
Counter({-0.23: 4,
         -0.39: 26,
         -0.21: 1,
         -0.71: 1,
         0.74: 3,
         0.26: 1,
         0.13: 1,
         0.53: 1,
         -0.17: 1,
         -0.54: 1,
         0.47: 2,
         -0.22: 2,
         0.85: 1,
         -0.62: 1,
         0.87: 1,
         -0.2: 2,
         -0.03: 1})
>>> len(Counter(test.round(2))) # Number of different elements
17
>>> Counter(test.round(2)).most_common()[0] # Get the most frequent item (thx @Mike Müller)
(-0.39, 26)
0 голосов
/ 13 февраля 2020

Не проверяйте counter > 20, просто возвращайте элементы на основе счетчика.

for i in test:
    counter = 0

    for j in test:
        if abs(i - j) < 10**(-2):
            counter += 1

        elements = counter - 1
        break

ИЛИ

начинайте со счетчика = -1 и просто возвращайте счетчик / или элементы

for i in test:
        counter = -1

        for j in test:
            if abs(i - j) < 10**(-2):
                counter += 1

            elements = counter
            break
...