类型错误:尝试指数拟合数据时,只有长度为1的数组可以转换为Python标量

77
f=np.loadtxt('Single Small Angle 1.txt',unpack=True,skiprows=2)
g=np.loadtxt('Single Small Angle 5.txt',unpack=True,skiprows=2)

x = f-g[:,:11944]
t=range(len(x))
m=math.log10(abs(x))

np.polyfit(t,m)

plt.plot(t,abs(x))
plt.show()

我只是不确定如何解决我的问题。它一直在说:

m=math.log10(abs(x))
TypeError: only length-1 arrays can be converted to Python scalars

18
如果你将一个原生的Python列表(如[1,2,3])传递给一个期望numpy数组的numpy方法时,你将会收到这个错误。那个numpy方法接收你的原生Python列表,并试图处理它,然后在深层次上出现了这个错误信息。一条更友好的错误信息应该是:TypeError: 不要将原生的Python列表输入到期望numpy数组的numpy函数中。要么将你的Python列表转换为numpy数组,要么将你的Python列表打包成元组。在这方面,Python numpy真的做得不够好,那个错误信息非常糟糕。 - Eric Leschinski
2个回答

100

math.abs() 或者 math.log10() 这样的非numpy函数不能很好地与numpy数组兼容。只需使用以下代码替换出错的行:

非numpy函数(如math.abs()math.log10())与numpy数组不兼容。只需用以下代码替换引发错误的行:

```python np.abs() # 替换 math.abs() np.log10() # 替换 math.log10() ```
m = np.log10(np.abs(x))

除此之外,np.polyfit() 调用将无法工作,因为它缺少一个参数(而且您也没有分配结果以进行进一步使用)。


1
非常好的回答。除此之外,我认为没有一个数学函数适用于numpy数组。最好用numpy函数来替换它们。 - endertunc
非常感谢!我遇到了一个类似的问题,使用math.power与其他numpy函数结合时。将math.power替换为numpy.power解决了这个问题。 - Aurgho Bhattacharjee

65

这里有另一种使用Python2.7和NumPy复现此错误的方法:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate(a,b)   #note the lack of tuple format for a and b
print(c) 

np.concatenate方法产生一个错误:

TypeError: only length-1 arrays can be converted to Python scalars

如果你阅读有关 numpy.concatenate 的文档,那么你会发现它需要一个 numpy 数组对象的元组。因此,将变量用括号括起来就可以解决问题:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate((a,b))  #surround a and b with parens, packaging them as a tuple
print(c) 

然后它会打印:

[1 2 3 4 5 6]

这里出了什么问题?

这个错误是由Python的鸭子类型哲学引起的冒泡实现 - 当它接收到一些意外的变量类型时,尝试运行并开始执行某些操作,但无法完成并抛出错误。 它会尝试进行补救操作,但最终失败,然后告诉你“当风从东边吹时,你不能重新制定子空间响应器”。在更合理的语言(例如C ++或Java)中,它会告诉你:“您无法在期望TypeB的位置使用TypeA”。但是Python会尽力而为,做一些未定义的事情,失败,然后返回一个没有帮助的错误消息。我们不得不讨论这个问题的事实之一就是我不喜欢Python或其鸭子类型哲学。


5
仍然出现在 Python 3 中,让我神秘地崩溃了。 - Christophe
尝试使用pdb调试器获取关于错误的更多信息:https://docs.python.org/3/library/pdb.html - Eric Leschinski
1
哦,抱歉我的帖子表达不清。我的意思是我也遇到了使用concatenate的问题,而你的回答解决了我的问题。你提到这是Python2.7和numpy的一个错误(特性?),但它在Python3和numpy中仍然存在 :) - Christophe
6
当周二东风吹过时,你不能重新构建子空间响应器。我喜欢你。 - rosstex
1
兄弟,我不会为一个坏掉的defrakulator支付70个smidgens给你。https://www.youtube.com/watch?v=Xk5A4QWyl1U - Eric Leschinski

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