【问题标题】:Why do I get "ufunc 'multiply' did not contain a loop with signature matching types dtype('S32') dtype('S32') dtype('S32')" with values from raw_input为什么我会得到“ufunc'multiply'没有包含签名匹配类型dtype('S32')dtype('S32')dtype('S32')的循环”与来自raw_input的值
【发布时间】:2017-06-20 05:08:33
【问题描述】:

我正在尝试创建一个非常简单的程序,该程序将绘制抛物线,其中v 是速度,a 是加速度,x 是时间。用户将输入va 的值,然后vax 将确定y

我试图这样做:

x = np.linspace(0., 9., 10)
a = raw_input('Acceleration =')
v = raw_input('Velocity = ')
y = v * x - 0.5 * a * x**2.

但是,我不断收到此错误:

TypeError: ufunc 'multiply' 不包含签名匹配类型 dtype('S32') dtype('S32') dtype('S32') 的循环

这是什么意思?

【问题讨论】:

    标签: python numpy typeerror python-2.x


    【解决方案1】:

    来自documentation of raw_input

    该函数然后从输入中读取一行,将其转换为字符串(去除尾随的换行符),然后返回。

    所以发生的情况是您尝试将一个字符串与一个浮点数相乘,例如 y="3" * x - 0.5 * "3" *x**2,它没有定义。

    避免这种情况的最简单方法是先将输入字符串强制转换为浮点数。

    x = np.linspace(0., 9., 10)
    a = float(raw_input('Acceleration ='))
    v = float(raw_input('Velocity = '))
    y = v * x - 0.5 * a * x**2
    

    请注意,如果您使用的是 Python 3,则需要使用 input 而不是 raw_input

    a = float(input('Acceleration ='))
    

    【讨论】:

    • 为什么这是最简单的方法?
    • 好吧,对于 python2,您可以使用 input 而不是 raw_input 但这隐藏了一点问题的根源。由于input 评估输入,因此存在各种隐藏陷阱,而float(raw_input()) 要么正常工作,要么抛出错误。
    • 所以投射到浮动是最安全的方式?
    • 安全,因为它可能会失败并抛出错误,但您将始终知道失败的原因(因为您没有输入数字)。对于初学者来说,这绝对是最容易理解的方式。
    【解决方案2】:

    我最近遇到了这个问题,通过执行将 x 的 dtype 更改为特定的东西:

    x = np.asarray(x, dtype='float64')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2023-04-03
      • 2021-11-23
      • 2021-07-28
      • 2016-08-06
      • 2018-07-25
      • 2019-03-27
      相关资源
      最近更新 更多