我目前正在写一个脚本,将一个口径内的星系的测量结果转换为光度。我使用的是带有Python 3和numpy的Jupyter笔记本。我还通过下面的第二个函数传播测量中的不确定性。
当我调用luminositieserror
函数时,返回的错误是:
TypeError: object of type 'numpy.float64' has no len().
我使用的代码如下:
#converts an array of magnitudes, a_mag, into an array of luminosities
def m_to_L(a_mag, g_dist, abs_s_mag):
list1 =[]
for i in range(len(a_mag)):
ans = 10**(-0.4*(a_mag[i] -5*np.log(g_dist) -5 -abs_s_mag))
list1.append(ans)
return np.array(list1)
#converts an array of magnitude uncertainties, a_mag_err
#into an array of luminosity uncertainties, by calculating
#uncertainty due to each variable in m_to_L and then adding
#them in quadrature, for every index in the array a_mag
def Luminosity_errors(a_mag, a_mag_err, g_dist, g_dist_err, abs_s_mag, abs_s_mag_err):
list1 =[]
for i in range(len(a_mag)):
alpha_mag = abs(m_to_L((a_mag[i] + a_mag_err[i]), g_dist, abs_s_mag) - m_to_L(a_mag[i], g_dist, abs_s_mag))
alpha_dist = abs(m_to_L(a_mag[i], (g_dist + g_dist_err), abs_s_mag) - m_to_L(a_mag[i], g_dist, abs_s_mag))
alpha_solar = abs(m_to_L(a_mag[i], g_dist, (abs_s_mag + abs_s_mag_err)) - m_to_L(a_mag[i], g_dist, abs_s_mag))
ans = (alpha_mag**2 + alpha_dist**2 + alpha_solar**2)**0.5
list1.append(ans)
return np.array(list1)
然后,我在定义良好的变量上调用函数:
luminositieserror = Luminosity_errors(appmagnitudes, appmagerror, g_dist, g_dist_err, abs_s_mag, abs_s_mag_err)
出现以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-35-7a37ab3a0861> in <module>
----> 1 luminositieserror = Luminosity_errors(appmagnitudes, appmagerror, g_dist, g_dist_err, abs_s_mag, abs_s_mag_err)
<ipython-input-32-96474bd06045> in Luminosity_errors(a_mag, a_mag_err, g_dist, g_dist_err, abs_s_mag, abs_s_mag_err)
14 for i in range(len(a_mag)):
15
---> 16 alpha_mag = abs(m_to_L((a_mag[i] + a_mag_err[i]), g_dist, abs_s_mag) - m_to_L(a_mag[i], g_dist, abs_s_mag))
17
18 alpha_dist = abs(m_to_L(a_mag[i], (g_dist + g_dist_err), abs_s_mag) - m_to_L(a_mag[i], g_dist, abs_s_mag))
<ipython-input-32-96474bd06045> in m_to_L(a_mag, g_dist, abs_s_mag)
3 list1 =[]
4
----> 5 for i in range(len(a_mag)):
6 ans = 10**(-0.4*(a_mag[i]-5*np.log(g_dist)-5-abs_s_mag))
7 list1.append(ans)
TypeError: object of type 'numpy.float64' has no len()
据我所知,我认为我需要说服Python,伪变量a_mag
实际上是一个数组。任何关于如何做到这一点的建议都将不胜感激!
发布于 2020-03-03 23:12:36
重写你的函数,这样它就可以同时处理NumPy数组和(标量)浮点数(值得注意的是,它不能处理列表:你必须先把它们转换成一个数组):
def m_to_L(a_mag, g_dist, abs_s_mag):
lum = 10. ** (-0.4 * a_mag - 5 * np.log(g_dist) - 5 - abs_s_mag)
return lum
正如您所看到的,这也要短得多,基本上可以将函数调用替换为主代码中的中间行。
与Luminosity_errors
类似。
发布于 2020-03-04 03:10:47
float64
对象是一个numpy
标量。虽然它有许多ndarray
属性,但它不是数组,也没有len
In [69]: x = np.float64(12)
In [70]: x
Out[70]: 12.0
In [71]: x.shape
Out[71]: () # 0d shape
In [72]: len(x)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-72-a7f4a5366567> in <module>
----> 1 len(x)
TypeError: object of type 'numpy.float64' has no len()
In [73]: x[()] # it can be indexed with an empty tuple
Out[73]: 12.0
制作0d数组的另一种方法:
In [74]: y = np.array(12,float)
In [75]: y
Out[75]: array(12.)
In [76]: y.shape
Out[76]: ()
In [77]: len(y)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-77-24c1855bc88d> in <module>
----> 1 len(y)
TypeError: len() of unsized object
但它也没有len
。
直接迭代也不起作用:
In [78]: for i in x: print(i)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-78-c1c708d34f18> in <module>
----> 1 for i in x: print(i)
TypeError: 'numpy.float64' object is not iterable
In [79]: for i in y: print(i)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-79-b6e658ea7a00> in <module>
----> 1 for i in y: print(i)
TypeError: iteration over a 0-d array
===
有几种方法可以确保数组对象是可迭代的,例如确保它是一维的:
In [83]: z=np.atleast_1d(12.)
In [84]: z
Out[84]: array([12.])
In [85]: z.shape
Out[85]: (1,)
In [86]: len(z)
Out[86]: 1
In [87]: for i in z:print(i)
12.0
====
但是,您的代码尝试在amag
上迭代两次。它假设amag
至少是2d。
def Luminosity_errors(a_mag, ....:
for i in range(len(a_mag)):
alpha_mag = abs(m_to_L((a_mag[i] ....
def m_to_L(a_mag, g_dist, abs_s_mag):
for i in range(len(a_mag)):
ans = 10**(-0.4*(a_mag[i] ...
换句话说,最后一行是试图在发送给Luminosity
的appmagnitudes
上使用appmagnitudes[i][j]
。
In [92]: mags = np.array([1.,2.,3.,4.])
In [93]: mags[0]
Out[93]: 1.0
In [94]: len(mags[0])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-94-d70c4034220e> in <module>
----> 1 len(mags[0])
TypeError: object of type 'numpy.float64' has no len()
对于2d mags
In [95]: mags = np.array([[1.],[2.],[3.],[4.]])
In [96]: mags.shape
Out[96]: (4, 1)
In [97]: len(mags[0])
Out[97]: 1
https://stackoverflow.com/questions/60510004
复制相似问题