TypeError:尝试以指数形式拟合数据时,只能将长度为1的数组转换为Python标量


76
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
当您将[1,2,3]之类的本机python列表提供给需要numpy数组的numpy方法时,会出现此错误。该numpy方法获取您的本机python列表,并尝试对其进行摘要,然后深入了解该列表。一条更加用户友好的错误消息应该是:TypeError: Don't feed native python lists into numpy functions that expect numpy arrays. Either convert your python list to a numpy array or package your python lists into a tuple. Python numpy确实丢下了那个错误消息,该错误消息非常糟糕。
埃里克·莱斯钦斯基

Answers:


100

像非numpy的功能math.abs()math.log10()不numpy的阵列发挥很好。只需将引发错误的行替换为:

m = np.log10(np.abs(x))

除此之外,该np.polyfit()调用将因缺少参数而无法工作(无论如何您都不会分配结果以供进一步使用)。


1
好答案。除此之外,我认为没有任何数学函数可用于numpy数组。最好使用numpy函数更改它们。
endertunc

非常感谢!我在与其他numpy函数结合使用math.power时遇到了类似的问题。用numpy.power替换math.power可以解决此问题。
Aurgho Bhattacharjee

65

这是使用numpy在Python2.7中重现此错误的另一种方法:

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调试器为您提供有关该错误的更多信息:docs.python.org/3/library/pdb.html
Eric Leschinski

1
哦,抱歉,我的帖子不清楚。我的意思是我在连接时遇到了同样的问题,您的回答为我解决了。您提到它是Python2.7和numpy的错误(功能?),但仍然存在于python3和numpy中:)
Christophe

6
“我喜欢你
rosstex

1
兄弟,我不会付给您70 smidgens损坏的除颤器。youtube.com/watch?v=Xk5A4QWyl1U
Eric Leschinski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.