Python和Numpy的值错误

2024-06-16 10:56:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python重建一首歌,但是我不能连接同一首歌的音符。 我得到这个错误:

ValueError: operands could not be broadcast together with shapes (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()

Tags: defasnppltdolamits
2条回答

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

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

pausa = nota(0,0.25)

创建musica(假设您已经修复了@fgb描述的pausa),方法是将51个注释堆叠为二维数组中的行。所以,musica.shape是{}

我认为您希望z是一个长的1D数组,其中所有的注释都在一行中,而不是每个注释都在各自的行中。有两种解决方案。一是说:

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

彻底清除所有这些:

^{pr2}$

更好的解决方案是在创建musica时使其成为1D数组:

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

这将获取所有的注释(pausaLa,等等)并将它们按orizontally(这样它们都放在一行中),因此您永远不需要展开或连接任何内容。在

相关问题 更多 >