首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型错误'numpy.float64‘没有我不能解决的len(),让Python相信它正在处理一个数组?

类型错误'numpy.float64‘没有我不能解决的len(),让Python相信它正在处理一个数组?
EN

Stack Overflow用户
提问于 2020-03-03 22:59:02
回答 2查看 1.1K关注 0票数 1

我目前正在写一个脚本,将一个口径内的星系的测量结果转换为光度。我使用的是带有Python 3和numpy的Jupyter笔记本。我还通过下面的第二个函数传播测量中的不确定性。

当我调用luminositieserror函数时,返回的错误是:

TypeError: object of type 'numpy.float64' has no len().

我使用的代码如下:

代码语言:javascript
运行
复制
#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)

然后,我在定义良好的变量上调用函数:

代码语言:javascript
运行
复制
luminositieserror = Luminosity_errors(appmagnitudes, appmagerror, g_dist, g_dist_err, abs_s_mag, abs_s_mag_err)

出现以下错误:

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
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实际上是一个数组。任何关于如何做到这一点的建议都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2020-03-03 23:12:36

重写你的函数,这样它就可以同时处理NumPy数组和(标量)浮点数(值得注意的是,它不能处理列表:你必须先把它们转换成一个数组):

代码语言:javascript
运行
复制
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类似。

票数 0
EN

Stack Overflow用户

发布于 2020-03-04 03:10:47

float64对象是一个numpy标量。虽然它有许多ndarray属性,但它不是数组,也没有len

代码语言:javascript
运行
复制
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数组的另一种方法:

代码语言:javascript
运行
复制
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

直接迭代也不起作用:

代码语言:javascript
运行
复制
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

===

有几种方法可以确保数组对象是可迭代的,例如确保它是一维的:

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
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] ...

换句话说,最后一行是试图在发送给Luminosityappmagnitudes上使用appmagnitudes[i][j]

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60510004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档