【问题标题】:TypeError: only size-1 arrays can be converted to Python scalars with a function and an arrayTypeError: 只有 size-1 的数组可以用函数和数组转换为 Python 标量
【发布时间】:2021-08-27 03:22:37
【问题描述】:

我有一个数组,我们称它为 e:

e=[1,2,3]

我将它包含在一个函数中:

def f(x,y):
 return (69+e[x]*g(x)*y)/(420+g(x)*y)

g(x) 是我之前定义的函数。现在,我想做一个等高线图,所以我定义:

x=[0,1,2]
y=np.linspace(69,420,69420)
X, Y = np.meshgrid(x, y)

fig, axs = plt.subplots()
axs.contour(X,Y,G(X,Y),levels=[420.69],colors='black')

这基本上是我想做的,我该如何调试呢?或者有没有更好的方法来编程我想做的事情?

编辑:哦,我打错了。我实际上在函数内部有e[int(x)],而不仅仅是e[x]

编辑:我的意思是通过使用我的代码的“简化”形式来简化我的问题,但似乎有些人对整个事情感兴趣。

我实际使用的不是f(x,y)

def Nseen(x,y):
return (0.147*8.815*10**(-6)+e[int(x/5-16)]*y*G(x)*2*y*GW(x))/(4.1/1000+y*G(x))*26340*20.3

其中G(x)GW(x) 本身是依赖于其他函数的其他函数,让我将整个代码粘贴在这里:

def a(x,m):
return (x**2-m**2)**2*(x**2+2*m**2)

def b(x,m):
return 6*(x**2-m**2)*m**2

def c(x,m):
return 3*(x**2-2*m**2)

def f1(x,m,g):
return -2*x**2*(x**2-2*m**2)+(a(x,m)+c(x,m)*g**2*m**2)/(g*m)*(np.arctan((x**2-m**2)/(g*m))-np.arctan((-m**2)/(g*m)))-1/2*(b(x,m)+2*g**2*m**2)*np.log((g**2*m**2+(x**2-m**2)**2)/(g**2*m**2+m**4))

def f(x,m,g):
return f1(x,m,g)*(m**4/(96*x**8))

def GW(x):
return GF**2*x**5/(np.pi**3)*(f(x,MW,GW))

def G(x):
return GF*MH*x**2/(4*np.sqrt(2)*np.pi)*(1-x**2/MH**2)**2

这些是我使用的所有数字:

GF=1.1663787*10**(-5)
S2TH=0.23122
MW=80.378
MZ=91.1876
MH=125.18
GW=2.085
GZ=2.4952

我正在使用:

e = [0.007400,0.002300,0.000600,0.01840,0.06040,0.09570,0.1412,0.1718,0.1718]

x = np.linspace(80,120,9)
y = np.linspace(10**(-8),10,1000)

【问题讨论】:

  • 你在函数的某个地方传递了一个数组,而它应该是一个值。您需要共享整个代码并显示出现此错误的行!
  • 这里的e[x] 是什么?...您不能将整个数组作为索引传递。请张贴g(x) 是什么。
  • @MohamedAfify 你说得对!我的代码中实际上有 e[int(x)],我打错了。
  • @Priya "e" 是数组。 e[int(x)] 应该调用数组的第 x 个元素。 e[0]=1,e[1]=2,e[2]=3。 g(x) 是我之前定义的一个复杂函数。我认为它不应该那么相关。
  • @pollux33 edit您的问题以添加新的详细信息。

标签: python python-3.x


【解决方案1】:

您的错误可以归结为:

import numpy

x = numpy.linspace(80,120,9)
e = [1,2,3]
print(e[int(x)])

TypeError:只有 size-1 的数组可以转换为 Python 标量

这是因为x 是一个 numpy 数组,不能用作列表的索引。注意:

print(x)

会给你类似的东西:

[ 80.  85.  90.  95. 100. 105. 110. 115. 120.]

我实际上不确定你希望用什么索引e,也许你可以试试:

e[int(x[0])]

这不是一个真正的答案,我会在你回复后将其删除,但这里的内容太多,无法发表评论。

【讨论】:

  • 我正在尝试将 e 索引到 80 到 120 之间的值。我想要的是数组的第一个元素 (0.007400) 对应于值 80,第二个到 85。 .. 这是因为其他函数,即 GW(x)G(x),确实依赖于这些明确的数字。
  • 您是否试图获取索引 80 和 120 之间的所有 e 值?这样你可能会做e[x[0]: x[-1]]?或者您是否希望创建一个字典,例如 {x[0]: e[0]} 可能是 zip(e, x)?我还是说不出来
  • 如果此代码简化封装了您的问题,您可能需要编辑您的问题以仅使用它,因为人们更容易理解和帮助您。这样我就可以删除这个 1/2 答案。
  • 如果你想要的是[e[80], e[85]...e[120]]的列表,那么你可以[e[i] for i in x]
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多