python - 类型错误'numpy.float64'没有我无法解决的len(),说服Python它正在处理一个数组?
问题描述
我目前正在编写一个脚本,将光圈内星系的测量大小转换为光度。我正在使用带有 Python 3 和 numpy 的 Jupyter Notebooks。我还通过下面的第二个函数传播测量中的不确定性。
当我想调用该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
实际上是一个数组。任何有关如何做到这一点的建议将不胜感激!
解决方案
重写您的函数,使其适用于 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
。