Как посчитать частоту элемента в массиве numpy? - PullRequest
1 голос
/ 23 апреля 2019

У меня есть массив массивов 3 D, который содержит элементы с повторениями. counterTraj.shape (13530, 1, 1 Например, counterTraj содержит такие элементы: я показал только несколько элементов:

         array([[[136.]],

       [[129.]],

       [[130.]],

       ...,

       [[103.]],

       [[102.]],

       [[101.]]])
```

Мне нужно найти частоту различных элементов: Пример: 136 считать 5 (скажем), 101 считать 12 (скажем). Элементы массива не фиксируются и изменяются вместе с входными данными. Я пытаюсь следующее: from collections import Counter Counter(counterTraj) Следующая ошибка генерирует:

> TypeError                                 Traceback (most recent 
    call last)
    <ipython-input-408-e3584b29b0bd> in <module>()
         11 counterTraj=np.vstack(counterTraj)
        12 counterTraj=counterTraj.reshape(len(counterTraj),1,1)
    ---> 13 Counter(counterTraj)
    /usr/lib/python3.6/collections/__init__.py in __init__(*args, 
   **kwds)
         533             raise TypeError('expected at most 1 arguments, 
      got %d' % len(args))
          534         super(Counter, self).__init__()
      --> 535         self.update(*args, **kwds)
         536 
       537     def __missing__(self, key):

     /usr/lib/python3.6/collections/__init__.py in update(*args, 
    **kwds)
         620                     super(Counter, self).update(iterable) # 
     fast path when counter is empty
         621             else:
      --> 622                 _count_elements(self, iterable)
       623         if kwds:
       624             self.update(kwds)

     TypeError: unhashable type: 'numpy.ndarray'

Как найти вхождение элемента с частотой и найти элемент с наивысшей частотой?

1 Ответ

2 голосов
/ 23 апреля 2019

Используйте numpy.unique с параметром return_counts=True, который будет возвращать счетчик каждого из элементов в массиве.

# sample array
In [89]: np.random.seed(23)
In [90]: arr = np.random.randint(0, 10, 20)

In [92]: a, cnts = np.unique(arr, return_counts=True)
In [94]: high_freq, high_freq_element = cnts.max(), a[cnts.argmax()]

In [95]: high_freq, high_freq_element
Out[95]: (4, 9)

Для выбора только элементовкоторые появляются выше определенного порога частоты, вы можете использовать:

In [96]: threshold = 2

# select elements which occur only more than 2 times
In [97]: a[cnts > threshold]
Out[97]: array([3, 5, 6, 9])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...