2

我正在尝试在 python 中重建一首歌曲,但我无法连接相同的音符。我收到此错误:

ValueError:操作数无法与形状一起广播 (0) (1250)

这是我的代码:

import numpy as np, matplotlib.pyplot as plt

def nota(f,d):
    ts = 0.0002
    t  = np.arange(0, d, ts)
    X  = 5500*np.cos(2*np.pi*f*t)
    return X

# II.2.b)
pausa    = nota(0,0)
La       = nota(440,0.25)
Mi       = nota(659.26,0.25)
Do       = nota(253.25,0.25)
Sol      = nota(783.99,0.25)
Si       = nota(493.88,0.25)
Solbemol = nota(830.61,0.25)

def FurElise():
    musica = np.array((pausa,pausa,La,Mi,La,pausa,pausa,Mi,Mi,Solbemol,    \
                       pausa,pausa,La,Mi,La,pausa,pausa,pausa,La,Mi,La,    \
                       pausa,pausa,Mi,Mi,Solbemol,pausa,pausa,La,Mi,La,    \
                       pausa,Do,Sol,Do,pausa,pausa,Sol,Sol,Si,pausa,pausa, \
                       La,Mi,La,pausa,pausa,Mi,Mi,Mi,pausa))
    y=0
    for x in musica:
        z=np.hstack((x,y))
        y = y+x
    z=np.hstack((x,y))
    plt.plot(z)
    plt.show()

FurElise()
4

2 回答 2

3

正如@filmor 所指出的,x并且y具有不同的形状,原因是您对pausa = nota(0,0). 通过使用 的d0,生成的数组是长度0,而所有其他数组都是长度1250,并且y = y+x最终会抛出您看到的错误(例如,在 3 次迭代之后,给定您当前的定义musica)。

假设您希望暂停与所有其他音符的​​长度相同,您可以重新定义pausa以消除错误:

pausa = nota(0,0.25)
于 2013-05-05T18:42:07.597 回答
1

您通过将 51 个音符堆叠为二维数组中的行来创建musica(假设您已pausa按照@fgb 的描述进行了修复)。那么,musica.shape(51, 1250)

我认为您希望z成为一个长的一维数组,其中所有音符都在一行中,而不是每个音符都在自己的行中。有两种解决方案。一,就是说:

musica = np.array((pausa,pausa,La,Mi,La,...))
z = musica.flatten()
plt.plot(z)

并完全删除所有这些:

y=0
for x in musica:
    z=np.hstack((x,y))
    y = y+x
z=np.hstack((x,y))

更好的解决方案是在创建musica一维数组时创建它:

musica = np.hstack((pausa,pausa,La,Mi,La,...))
plt.plot(musica)

这会获取所有音符(pausaLa等)并将它们水平堆叠(以便它们都在一行中),因此您永远不需要展平或连接任何东西。

于 2013-05-06T16:29:46.727 回答