numpy 在循环中,不能对具有单值返回的函数的输出使用“if语句”,(使用.any()或.all()错误)

nwlqm0z1  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(68)

第一次在这里问问题。
下面的代码应该绘制核的“中子滴线”。它表示,对于原子序数(Z)的每个特定值,中子数(N)的极限值,超过该极限值,增加一个中子将使核不稳定。不稳定性由分离能变为负来表示,其中分离能是指(Z,N)和(Z,N+1)组合的结合能值的差异。我使用以下步骤来实现相同的:
1.从A值列表中创建Z值和N值的数组。我定义了一个zmin()函数来获得Z的值,并取与A的差来获得N的值。
1.取一个Z值并计算一系列N个增量值的结合能,直到(Z,N)和(Z,N+1)组合之间的间隔返回负值。将出现这种情况的N的值附加到下一个Z值上,直到列表的末尾。

import numpy as np
import matplotlib.pyplot as plt

avol = 15.5  # Initializing the coefficients
asurf = 16.8
acol = 0.72
asym = 23

def bind_en (Z, N):  #Defining a function to calculate binding energy 
                    #curve using semi-emperical mass formulae
    if ((Z+N)%2)!=0 and (Z%2)==0:
        apar=0
    elif ((Z+N)%2)==0 and (Z%2)!=0:
        apar=0
    elif ((Z+N)%2)==0 and (Z%2)==0:
        apar=34
    elif ((Z+N)%2)!=0 and (Z%2)!=0:
        apar=-34
          
    b = avol*(Z+N)-asurf*((Z+N)**(2/3))-(acol*Z*(Z-1))/((Z+N)**(1/3))-asym*(((Z+N)-2*Z)**2)/(Z+N)+apar/((Z+N)**(3/4))  
    
    return b/A

def zmin(A):
    z = (A / 2) * (1 / (1 + 0.25 * (A ** (2 / 3)) * (acol / asym)))
    z = int(z)
    return z

A = np.arange(1, 261, 1)
Z = []
N = []
NM=[]

for i in range(len(A)):
    Z.append(zmin(A[i]))
    N.append(A[i]-Z[i])

flag=False

for j in range(len(Z)):
    for k in range(len(N)):
        s=bind_en(Z[j],N[k+1])-bind_en(Z[j],N[k])
        '''if isinstance(s, np.ndarray):
            print("s is an array.")'''
        if s<0:
            NM.append(N[k])
            flag=True
            break         
    if flag:
        break

plt.plot(NM, Z)
plt.xlabel('Number of Neutrons (N)')
plt.ylabel('Number of Protons (Z)')
plt.grid(True)
plt.show()

字符串
在执行时,会显示此错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[27], line 45
     42 s=bind_en(Z[j],N[k+1])-bind_en(Z[j],N[k])
     43 '''if isinstance(s, np.ndarray):
     44     print("s is an array.")'''
---> 45 if s<0:
     46     NM.append(N[k])
     47     flag=True

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()


我理解这个错误的意思是's'变量是一个数组(注解的isinstance()函数确实验证了这一点,因此它不能与单个值0进行比较。
但我不明白它怎么会是数组。请问有什么办法能修好吗?

polkgigr

polkgigr1#

A是一个数组,定义为:

A = np.arange(1, 261, 1)

字符串
因此,当你的函数bind_en返回return b/A,其中b是一个数字,结果也是一个数组-A的每个元素都被用作b的除法器,新数组由结果组成。
如果您期望结果是一个数字,则整个数组不应成为计算的一部分。我不确定你的代码背后的数学,但对于其他数组,你使用索引来选择某个元素(例如bind_en(Z[j],N[k+1])),也许你也可以用A来做?否则,可以考虑聚合函数(例如sum(A))。

klsxnrf1

klsxnrf12#

问题出在bind_en函数中:

def bind_en (Z, N):
    ... code
    b = ....

    print(type(b)) # <class 'numpy.float64'>
    print(type(A)) # <class 'numpy.ndarray'>
    print(type(b/A)) # <class 'numpy.ndarray'>
 
    return b/A

字符串
您返回B/A。B/A的类型是一个numpy数组,不能与整数0进行比较。

相关问题