【问题标题】:ValueError with Python and NumpyPython 和 Numpy 的 ValueError
【发布时间】:2013-05-05 17:27:26
【问题描述】:

我正在尝试在 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()

【问题讨论】:

  • 您预计会发生什么? x 是一个数组,y 是一个数字,如果我没记错的话……
  • 两个小点:你真的应该努力code in English(避免Spanish variable names),你应该咨询PEP 8变量命名指南。例如,在 CamelCase 中查看变量和函数定义会令人困惑。
  • 我的变量是葡萄牙语,不是西班牙语 :)

标签: python python-2.7 numpy


【解决方案1】:

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

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

pausa = nota(0,0.25)

【讨论】:

  • 奇怪,因为仅在示例脚本中切换该行代码就可以解决我的问题。你确定你没有在另一行代码中看到错误吗?尝试直接修改您的示例脚本并报告。
【解决方案2】:

您通过将 51 个音符堆叠为二维数组中的行来创建 musica(假设您已按照 @fgb 的描述修复了 pausa)。所以,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 等)并将它们h横向堆叠(以便它们都在一行中) ,所以你永远不需要展平或连接任何东西。

【讨论】:

  • +1 表示第二种方法(直接np.hstack() 所有注释),它不需要pausa 具有特定长度并大大简化了代码。
  • @fgb 从语法上讲,它不需要pausa 具有有限的长度,但考虑到程序,我认为pausa 仍然应该有一个有限的持续时间,否则它甚至不会存在.
  • 我同意你的观点,它应该有一些长度,但我怀疑强制它与所有其他注释的长度相同是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2013-08-23
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多