我是Python的新手,我认为它与Java有很大不同。
我查看了其他答案,它们暗示错误的原因是我在期望传递一个值时却传递了一个数组。我不确定这一点。我相当肯定我只是在传递一个值。
第97行的代码是:exponential = math.exp(-(math.pow(feature_value-mean, 2) / (2*math.pow(standard_deviation, 2))))
错误的完整文本是:
Traceback (most recent call last): File "D:/Personal/Python/NB.py", line 153, in <module> main() File "D:/Personal/Python/NB.py", line 148, in main predictions = getPredict(summaries, testing_set) File "D:/Personal/Python/NB.py", line 129, in getPredict classification = predict(results, testData[index]) File "D:/Personal/Python/NB.py", line 117, in predict probabilities = Classify(feature_summaries, classifications) File "D:/Personal/Python/NB.py", line 113, in Classify probabilities[classes] = probabilities[classes] * GaussianProbabilityDensity(feature_value, mean, standard_deviation) File "D:/Personal/Python/NB.py", line 97, in GaussianProbabilityDensity exponential = math.exp(-(math.pow(feature_value-mean, 2) / (2*math.pow(standard_deviation, 2))))TypeError: only size-1 arrays can be converted to Python scalars
如果有帮助,以下是csv
文件的内容。值得注意的是,我有另外两个算法可以在这个数据集上正常运行。
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 || 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 || 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 || 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 || 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 || 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 || 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 || 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 || 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 || 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 || 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 || 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 || 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 || 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 || 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 || 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 || 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
回答:
math.pow
(以及所有math
函数)只能处理标量,即单个数字(整数或浮点数)。错误提示说其中一个参数,例如standard_deviation
,是一个包含多个元素的numpy
数组,因此无法转换为标量并传递给math.pow
。
这发生在你自己的代码中,因此追溯这些变量的来源并不困难。
要么是你无意中传递了一个数组给这个函数,要么你需要用np.pow
(和np.exp
)函数替换math.pow
,这些函数可以处理数组。
你从csv
文件加载数据时生成了一个numpy
数组
data = numpy.loadtxt(data, delimiter=',')# 遍历数组中的数据for index in range(len(data)): # 使用try catch尝试转换为浮点数,如果无法转换为浮点数,则转换为0 try: data[index] = [float(x) for x in data[index]] except ValueError: data[index] = 0
loadtxt
返回一个数组,默认类型是浮点数(dtype)。它的所有元素都将是浮点数——如果读取到不是有效浮点数的内容,它会引发错误。因此,不需要这个循环。而且这个循环看起来太像是为列表编写的,而不是为数组编写的。
randomize_data
不应该返回任何内容。np.random.shuffle
会就地操作csv
。这不会引起错误。