首页 > 解决方案 > 类型错误'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实际上是一个数组。任何有关如何做到这一点的建议将不胜感激!

标签: pythonarraysnumpy

解决方案


重写您的函数,使其适用于 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


推荐阅读