Расширение кода на основе Numpy, который обнаруживает частоту последовательного числа для работы над многомерным массивоPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Расширение кода на основе Numpy, который обнаруживает частоту последовательного числа для работы над многомерным массиво

Сообщение Anonymous »

Этот ответ 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»