簡體   English   中英

列表理解的頻率數據幀?

[英]DataFrame of frequencies by list comprehension?

我正在嘗試在 A1 (55Hz) 和 A8 (7040Hz) 之間構建一個半音頻率的 Pandas DataFrame。 本質上,我希望它看起來像這樣......

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”,我可以通過將 1 或 -1 分配給 step 變量來對給定的音符進行 n 次半音增加或減少。

我的問題是,如何創建一個 DataFrame,其中所有行看起來都像我手動完成的那樣,但是使用列表理解來形成行?

只需迭代音高並在之后重塑結果:

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 數組所需的頻率,但它們不是 DataFrame 所需的表格形式。 reshape創建數組內容的視圖,其形狀為(n_octave, 12) ,因此行是連續的。 例如

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

這只是 DataFrame 所需的格式。

從你開始:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM