#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)
.