Применить счетчик к массивам numpy, чтобы получить режим столбцов - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть три numpy массива

import numpy as np

a=np.array([1,2,4,4])
b=np.array([1,3,4,3])
c=np.array([1,2,3,3])

Мне нужен вывод типа

array([1,2,4,3])

Где значение по индексу i в наиболее частом элементе в столбце, т.е.

  • В первом столбце 1 появляется наибольшее количество раз;
  • Во втором столбце: 2 появляется наибольшее количество раз;

и так далее. .

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы можете использовать Counter следующим образом.

from collections import Counter
result = []
for i,_ in enumerate(zip(a,b,c)):
  count = Counter([a[i], b[i], c[i]])
  result.append(count.most_common(1)[0][0])

result даст [1,2,4,3].

0 голосов
/ 23 апреля 2020

Если у вас есть зависимость от scipy, вы можете использовать встроенную функцию scipy.stats.mode вдоль оси 0 сгруппированных массивов. В противном случае вы можете использовать numpy .unique или collection.Counter вдоль столбцов сложенного массива.

Scipy Mode

import numpy as np
from scipy.stats import mode
from collections import Counter

a = np.array([1,2,4,4])
b = np.array([1,3,4,3])
c = np.array([1,2,3,3])

m = np.vstack([a,b,c])

mode(m, axis=0)[0]
array([[1, 2, 4, 3]])

Numpy Уникальный

modes_numpy = []

for c in m.T:
    vals, counts = np.unique(c, return_counts=True)
    index = np.argmax(counts)
    modes_numpy.append(vals[index])

modes_numpy
[1, 2, 4, 3]

Счетчик коллекций

modes_counter = []

for c in m.T:
    modes_counter.append(Counter(c).most_common(1)[0][0])

modes_counter
[1, 2, 4, 3]
...