TypeError:在尝试以指数方式拟合数据时,只能将length-1数组转换为Python标量

use*_*404 73 python arrays scalar logging

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()
Run Code Online (Sandbox Code Playgroud)

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

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

Tom*_*ohl 95

非numpy函数喜欢math.abs()或math.log10()不能很好地使用numpy数组.只需用以下代码替换引发错误的行:

m = np.log10(np.abs(x))
Run Code Online (Sandbox Code Playgroud)

除此之外,np.polyfit()调用将无法正常工作,因为它缺少一个参数(并且您无需分配结果以供进一步使用).


Eri*_*ski 62

这是使用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) 
Run Code Online (Sandbox Code Playgroud)

该np.concatenate方法产生错误:

TypeError: only length-1 arrays can be converted to Python scalars
Run Code Online (Sandbox Code Playgroud)

如果您阅读numpy.concatenate周围的文档,那么您会看到它需要一个numpy数组对象的元组.所以用parens围绕变量修复它:

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) 
Run Code Online (Sandbox Code Playgroud)

然后打印:

[1 2 3 4 5 6]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

这个错误是泡沫实现的一个例子 - 它是由python的duck-typing哲学引起的.这是一个神秘的低级别错误python guts,当它收到一些意想不到的变量类型,试图逃跑并做某事,获得部分通过,呕吐,尝试补救行动,失败,然后告诉你"你可以"当风从东方吹来时,重新制定子空间响应者".

在更合理的语言中,比如C++或Java,它会告诉你:"你不能使用预期TypeB的TypeA".但是Python最好是继续战斗,做一些未定义的事情,失败,然后把你带回一个无益的错误.我们必须讨论这个事实是我不喜欢Python或其鸭子类型哲学的原因之一.

  • 仍然发生在python 3并神秘地杀了我. (4认同)
  • "当风从东方吹来时,你无法对子空间响应者进行改造"我喜欢你 (4认同)