Как верно записать массив

[   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
→ Ссылка