TypeError:只有length-1数组可以转换为Python标量,同时尝试以指数方式拟合d

2024-04-20 02:51:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: txttruelennprangepltmathabs
2条回答

下面是在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数组对象元组。因此,用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) 

然后它会打印:

[1 2 3 4 5 6]

这里怎么了?

这个错误是冒泡实现的一个例子——它是由python的duck类型哲学引起的。这是一个神秘的低级错误python guts puke up,当它接收到一些意外的变量类型,试图跑掉并做一些事情,得到一部分通过,pukes,尝试补救行动,失败,然后告诉你“当周二的风从东方吹来时,你无法重新构造子空间响应器”。

在更为敏感的语言如C++或java中,它会告诉你:“你不能使用TypeB所期望的类型。”但Python做的最好是坚持下去,做一些未定义的事情,失败了,然后把一个无用的错误交给你。我们必须讨论这一点,这是我不喜欢Python或它的duck类型哲学的原因之一。

math.abs()math.log10()这样的非numpy函数不能很好地处理numpy数组。只需将引发错误的行替换为:

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

除此之外,np.polyfit()调用将不起作用,因为它缺少一个参数(而且您也不会分配结果以供进一步使用)。

相关问题 更多 >