Этот ответ Stackoverflow предоставляет простой способ (ниже), чтобы найти частоту и индексы последовательных повторяющихся чисел. Это решение намного быстрее, чем код на основе цикла (см. Исходное сообщение выше). < /P>
boundaries = np.where(np.diff(aa) != 0)[0] + 1 #group boundaries
get_idx_freqs = lambda i, d: (np.concatenate(([0], i))[d >= 2], d[d >= 2])
idx, freqs = get_idx_freqs(boundaries, np.diff(np.r_[0, boundaries, len(aa)]))
< /code>
и вывод < /p>
# aa=np.array([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
(array([ 1, 3, 6, 10]), array([2, 3, 4, 5]))
# aa=np.array([1,1,1,np.nan,np.nan,1,1,np.nan])
(array([0, 5]), array([3, 2]))
< /code>
задаюсь вопросом, можно ли расширить это решение для работы над многомерным массивом вместо медленного традиционного цикла, как следующее: < /p>
#%%
def get_frequency_of_events_fast(aa):
boundaries = np.where(np.diff(aa) != 0)[0] + 1 #group boundaries
get_idx_freqs = lambda i, d: (np.concatenate(([0], i))[d >= 2], d[d >= 2])
idx, freqs = get_idx_freqs(boundaries, np.diff(np.r_[0, boundaries, len(aa)]))
return idx,freqs
tmp2_file=np.load('tmp2.npz')
tmp2 = tmp2_file['arr_0']
idx_all=[]
frq_all=[]
for i in np.arange(tmp2.shape[1]):
for j in np.arange(tmp2.shape[2]):
print("==>> i, j "+str(i)+' '+str(j))
idx,freq=get_frequency_of_events_fast(tmp2[:,i,j])
idx_all.append(idx)
frq_all.append(freq)
#if j == 69:
# break
print(idx)
print(freq)
#if i == 0:
# break
< /code>
Я добавил индексы и частоты к одному размерному списку, а также мне было интересно, есть ли способ добавить в двухмерный массив. Вот образец вывода < /p>
==>> i, j 0 61
[ 27 73 226 250 627 754 760 798 825 891 906]
[ 12 8 5 17 109 5 12 26 30 12 3]
==>> i, j 0 62
[ 29 75 226 250 258 627 754 761 800 889]
[ 11 7 5 6 6 114 5 14 57 21]
==>> i, j 0 63
[ 33 226 622 680 754 762 801 888]
[ 9 5 56 63 5 21 58 26]
==>> i, j 0 64
[ 33 226 615 622 693 753 762 801 889 972 993]
[12 5 4 68 54 6 21 60 26 3 2]
==>> i, j 0 65
[ 39 615 621 693 801 891 972 987 992]
[ 7 3 70 90 61 24 3 2 7]
==>> i, j 0 66
[ 39 617 657 801 891 970 987]
[ 7 34 132 63 30 5 13]
==>> i, j 0 67
[ 39 88 621 633 657 680 801 804 891 969 986]
[ 11 4 6 2 6 110 2 63 30 6 14]
==>> i, j 0 68
[ 39 87 681 715 740 766 807 873 891 969 984]
[12 6 33 3 22 24 60 3 31 6 16]
Подробнее здесь: https://stackoverflow.com/questions/794 ... e-number-t
Расширение кода на основе Numpy, который обнаруживает частоту последовательного числа для работы над многомерным массиво ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Подсчитать частоту букв в строке, но показать частоту, соответствующую каждой букве
Anonymous » » в форуме JAVA - 0 Ответы
- 75 Просмотры
-
Последнее сообщение Anonymous
-