Как верно записать массив
[ 0 3 118 -272 7 -150 47 337 -51 0 -152 -244 1 -28
132 -89 26 -10 24 -79 230 130 -284 -88 265 -25 -213 -147
84 -95 -61 -68 -59 -39 -93 -844 416 -3 13 -870 327 189
-223 -276 153 437 -219 -178 -91 164 149 33 16 -74 -248 122
-57 78 -460 88 -199 -13 -218 97 117 -2 196 -142 103 -62
150 -291 -168 -235 11 -32 -54 -37 -243 66 201 76 -56 -209
-99 -56 373 -40 -182 -146 32 86 72 112 13 316 -277 236
-25 72 11 -277 -14 22 -19 172 -77 -268 -364 267 179 -407
-90 -89 115 106 -72 44 -9 -18 -72 -328 20 120 -63 -54
-43 -172 -93 -117 73 -5 70 -22 1 60 244 -152 405 108
-65 33 -32 -138 414 -25 83 -44 -11 -105 -108 -146 30 25
275 36 -9 23 378 -148 -43 94 40 165 -293 83 101 271
26 116 412 -64 -115 223 107 91 -44 -77 -6 77 -2 -123
-47 12 38 44 92 -49 -292 -145 -317 -13 -1 -15 -6 -119
-40 -104 -63 -23 23 -146 41 -81 35 2 452 166 85 82
7 -45 143 -39 -57 -64 14 -25 2 80 -164 26 117 70
31 0 267 138 -42 42 84 -403 -111 -181 69 -50 -69 -22
-12 78 8 47 -54 -121 -232 109 -112 37 -80 -58 -8 -160
35 -77 -57 133 -471 -366 60 -36 38 134 204 15 8 129
214 -223 42 -107 224]
Данный массив получаю при помощи
wav = wave.open(f'{patch}2333_fixed.wav', mode="r")
(nchannels, sampwidth, framerate, nframes, comptype, compname) = wav.getparams()
coun = 2 if duration > 3000 else 3 if duration > 2000 else 4 if duration > 1000 else 5 if duration > 600 else 8 if duration > 300 else 9
w = duration*coun
ms = np.frombuffer(wav.readframes(nframes), dtype={1: np.int8, 2: np.int16, 4: np.int32}[sampwidth])[0::int(nframes/w*4)]
Считываю аудио, выставляю ширину побольше, если дорожка уж очень короткая, и получаю массив.
Первый вопрос, как верно данный массив обрезать? Скажем, необходимо 30% его, что по центру. Второй вопрос, как возможно искать вхождения в массиве? Скажем, основной массив, тот, что выше, а второй - это его 30%, что по центру. Как найти вхождение, допуская погрешность в 20%?
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Нет ничего сложного выделить нужный вам срез из исходного массива:
import numpy as np
import math
arr = [0,3,118,272,7,150, 47,337,-51,0,152,244,1,-28,132,-89, 26,-10, 24,-79,230,130,284,-88,265]
вычисляем 30% срез (от середины массива):
sample_width = 0.30 #30% <- ширина в сотых. 30 (процентов)/100 = 0.3
slice_start = math.floor((len(arr)-1)*(1 - sample_width)/2)
slice_end = math.ceil((len(arr)-1)*(0.5 + sample_width/2))
sample = arr[slice_start:slice_end+1]
получаем sample - шаблон, с которым потом будем сравнивать другие списки:
[-51, 0, 152, 244, 1, -28, 132, -89, 26]
Теперь можно воспользоваться методом numpy isclose c толерантностью 0.2 (20%):
test1 = [-51, 0, 152, 240, 1, -28, 132, -89, 26]
test2 = [-51, 0, 152, 0, 1, -28, 132, -89, 26]
test3 = [0, 0, 152, 240, 14, -28, 132, -89, 26]
print(all(np.isclose(sample, test1, 0.2))) # True
print(all(np.isclose(sample, test2, 0.2))) # False
print(all(np.isclose(sample, test3, 0.2))) # False