使用Numpy查找输入数字集的平均值、中位数、众数或范围

7

我正在创建一个程序来查找均值、中位数、众数或范围。当我运行它时,一切都很好,直到计算答案的部分。它给了我一个“无法使用可变类型执行缩减”的错误。我已经搜索了这个错误,但找不到需要修复的内容。这是我第一次使用numpy,所以任何帮助都将是极好的。

import sys
import numpy as np

welcomeString = input("Welcome to MMMR Calculator\nWhat would you like to calculate(Mean,Median,Mode,Range):")

if welcomeString.lower() == "mean":
   meanNumbers = input("What numbers would you like to use?:")
   print (np.average(meanNumbers))
   stop = input()

if welcomeString.lower() == "median":
    medianNumbers = input("What numbers would like to use?:")
    print (np.median(medianNumbers))
    stop = input()

if welcomeString.lower() == "mode":
    modeNumbers = input("What numbers would you like to use?:")
    print (np.mode(modeNumbers))
    stop = input()

if welcomeString.lower() == "range":
    rangeNumbers = input("What numbers would you like to use?:")
    print (np.arange(rangeNumbers))
    stop = input()

尝试访问https://dev59.com/wWvXa4cB1Zd3GeqPJHGA,获取列表中一列的总和时出现TypeError:无法执行reduce操作。 - user220878
当我这样做,并找到1、2、3、4的平均值时,它会打印出函数mean在0x02330858处。那是什么意思? - Hartbypass
如果你将第一个问题的答案存储在一个变量中,就可以避免重复四次写第二个问题。另外,四个选项中的最后一个input()是关于什么的? - Jblasco
你说的“catch the answer”是什么意思?我在那里放置了最后一个input()以停止程序,这样我就可以在窗口关闭之前看到输出结果。 - Hartbypass
np.arange 真的计算范围吗?!我以为它应该在一个范围内生成数字?! - sdbbs
2个回答

7
您正在向函数传递一个不允许的字符串。
>>> meanNumbers = input("What numbers would you like to use?:")
What numbers would you like to use?:1 2 3 4 5 6
>>> np.average(meanNumbers)
    #...
TypeError: cannot perform reduce with flexible type

你需要将它们制成一个数组或列表。
>>> np.average(list(map(float, meanNumbers.split())))
3.5

如果你是通过逗号分隔元素的话,就在逗号上进行拆分。
>>> np.average(list(map(float, meanNumbers.split(','))))
    3.5

"C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\Extensions|Microsoft\Python Tools for Visual Studio\2.0\visualstudio_py_util" 第70行,在exec_file中执行文件 exec(code_obj, global_variables)。 - Hartbypass
你需要剩下的吗? - Hartbypass
你好!你的 Print 中似乎有一个 P,应该改为小写的 print。另外,在你的代码中直接使用 float() 调用 float 是不可能的,请将我的答案的最后一行原封不动地粘贴到你的代码中。 - Sukrit Kalra
非常感谢。我甚至没有意识到我做了什么。 - Hartbypass
@Hartbypass:我为Python 3.3安装了Numpy,并修复了您上面代码中的错误。map返回一个不受numpy支持的映射对象,将其转换为列表解决了问题。请参见上面已修复的代码。 - Sukrit Kalra
显示剩余5条评论

6

这不是一个答案(请参阅@Sukrit Kalra的回复),但我看到了一个展示如何编写更清晰代码的机会,我不能放过。你有大量的代码重复,这将导致未来难以维护的代码。相反,建议尝试以下方法:

import sys
import numpy as np

welcomeString = input("Welcome to MMMR Calculator\nWhat would you like to calculate(Mean,Median,Mode,Range):")
welcomeString = welcomeString.lower() # Lower once and for all

# All averages need to do this
numbers = input("What numbers would you like to use?:")
numbers = list(map(float, numbers.split(','))) # As per Sukrit Kalra's answer

# Use a map to get the function you need
average_function = { "mean": np.average,
                     "median": np.median,
                     "mode": np.mode,
                     "range": np.arange,
                   } 

# Print the result of the function by passing in the
# pre-formatted numbers from input
try:
    print (average_function[welcomeString](numbers))
except KeyError:
    sys.exit("You entered an invalid average type!")

input() # Remove when you are done with development

谢谢,这肯定会在未来有所帮助。至于 stop = input(),它让我在代码窗口关闭之前看到输出。这样做有什么不好吗? - Hartbypass
嘿,当你编辑了代码后,我尝试运行它,但出现了“不支持的操作数类型:/用于'map'和'float'”。这可能是什么原因? - Hartbypass
你需要明确你输入的内容和你的代码是什么。请相应地编辑问题。 - Sukrit Kalra
我在我的代码中使用了他的解决方案。根据他的解决方案的评论,似乎你已经让它工作了。我同意Sukrit的观点,你需要给我们提供一个例子,当程序提示你“你想使用什么数字?”时,你将要输入什么。 - SethMMorton
你是不是不小心写成了 map/float 而不是 map(float) - SethMMorton
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接