функция python или, в частности, numpy, которая возвращает массив с количеством повторений элемента в строке

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

то, что я ищу, — это функция, которая при задании «a» вернет «b» следующим образом:

 a = numpy.array([1, 1, 1, 1, 5, 5, 5, 5, 5, 6, 5, 2, 2, 2, 2])
  

который сначала 1 показывает 4 раза подряд, после этого 5 показывает 5 раз, 6 показывает 1 раз, 5 показывает 1 и 2 показывает 4 раза

и то, что вернет, будет таким массивом:

 b = numpy.array([4, 5, 1, 1, 4])
  

функция, которую я ищу, будет обрабатывать 5 таким образом, даже если 5 находится в массиве «a» всего 6 раз, он будет учитываться отдельно для каждой последовательности

это очень специфично, я написал подобную функцию, но я хочу знать, есть ли в numpy встроенная функция, подобная этой, для быстрой производительности

заранее спасибо

Комментарии:

1. Нет, встроенной функции нет. Однако выполнить последовательный подсчет достаточно просто. Если вы хотите увидеть более общее решение, изучите «кодирование длины выполнения»

Ответ №1:

Это можно сделать с bincount cumsum помощью ненулевой разницы:

 out = np.bincount((np.diff(a)!=0).cumsum())
out[0]  = 1
  

Вывод:

 array([4, 5, 1, 1, 4])
  

Ответ №2:

Вы также можете использовать дополнительные атрибуты np.diff для создания массива различий с добавлением дополнительных единиц измерения на обоих концах искусственно:

 >>> np.diff(a,prepend=a[0]-1,append=a[-1] 1)
array([ 1,  0,  0,  0,  4,  0,  0,  0,  0,  1, -1, -3,  0,  0,  0,  1])
  

Теперь это готово для комбинации np.diff и np.nonzero :

 x = np.diff(a, prepend=a[0]-1, append=a[-1] 1)
np.diff(np.nonzero(x))
  

Вывод:

 array([[4, 5, 1, 1, 4]], dtype=int32)
  

Но это немного медленнее: в 3 раза медленнее для небольшого массива a и на 25% медленнее для большого массива a = np.random.randint(3,size=10000000) .