DataFrame частот по списку понимания? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь построить панду DataFrame из хроматических частот между A1 (55 Гц) и A8 (7040 Гц). По сути, я хочу, чтобы это выглядело так ...

df = pd.DataFrame(columns=['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'])
df.loc[0] = (55, 58.27, 61.74, 32.7, 34.65, 36.71, 38.89, 41.2, 43.65, 49, 51.91)

Но без необходимости вручную назначать все частоты для их соответствующих нот и с октавой на ряд (октава от 1 до 8).

На основе сайта http://pages.mtu.edu/~suits/notefreqs.html, интервал между каждой заметкой (или «полушагом») для одной заметки равен ...

def hz_stepper(fixed_note, steps):
    a = 2 ** (1/12)
    return fixed_note * a ** steps

Используя эту функцию 'hz_stepper', я могу хроматически увеличивать или уменьшать данную ноту n раз, присваивая 1 или -1 переменной steps.

У меня вопрос, как мне создать DataFrame, где все строки выглядят так, как я это делал вручную, но используя понимание списка для формирования строк?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

с самого начала:

df = pd.DataFrame(columns=['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'])
df.loc[0] = 55*2**(np.arange(12)/12)
for i in range(8): df.loc[i+1]=2*df.loc[i]
0 голосов
/ 10 ноября 2018

просто итерируйте по шагам и измените результат впоследствии:

import numpy as np
import pandas as pd

base = 55.
n_octave = 8
columns = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#']

factors = 2**(np.arange(12 * n_octave) / 12.)
pd.DataFrame(data=base * factors.reshape((n_octave, 12)), columns=columns)

Объяснение

factors - это требуемые частоты в виде 1d numpy array, но они не в табличной форме, необходимой для DataFrame. reshape создает представление содержимого массива, имеющего форму (n_octave, 12), так что строки являются смежными. Э.Г.

>>> np.arange(6).reshape((2, 3))
array([[0, 1, 2],
       [3, 4, 5]])

Это просто формат, необходимый для DataFrame.

...