Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建一维数组,其中元素是存储函数的二维numpy数组的和_Python_Arrays_Numpy_Stored Functions_Python 3.7 - Fatal编程技术网

Python 创建一维数组,其中元素是存储函数的二维numpy数组的和

Python 创建一维数组,其中元素是存储函数的二维numpy数组的和,python,arrays,numpy,stored-functions,python-3.7,Python,Arrays,Numpy,Stored Functions,Python 3.7,如果以前有人问过,我道歉。我对python和编程都是新手,所以如果有人问我,请告诉我正确的方向。我正在使用python 3.7 我有一个2D numpy数组,其中每个元素都是一个存储函数。我想在每列中添加函数,以获得一个1D数组,其中1D数组的元素是单个函数。我不知道为什么np.sum()函数不起作用。我得到一个1D数组,但函数仅来自“NPWAVEXNS”数组的第一列 i、 e [[X00,X01,…,X0n] [X10,X11,…,X1n] [Xn0,Xn1,…[Xnn]] ->[[X00+

如果以前有人问过,我道歉。我对python和编程都是新手,所以如果有人问我,请告诉我正确的方向。我正在使用python 3.7

我有一个2D numpy数组,其中每个元素都是一个存储函数。我想在每列中添加函数,以获得一个1D数组,其中1D数组的元素是单个函数。我不知道为什么np.sum()函数不起作用。我得到一个1D数组,但函数仅来自“NPWAVEXNS”数组的第一列

i、 e

[[X00,X01,…,X0n]

[X10,X11,…,X1n]

[Xn0,Xn1,…[Xnn]]

->[[X00+X10+…+Xn0,X01+X11+…+Xn1,X0n+X1n+…+Xnn]]

np.sum()函数似乎适用于整数,因此我不确定当元素是函数时它为什么不起作用。下面给出了我的代码示例。如果此代码工作正常,我怀疑在使用“4”基函数时会得到这4个图

来自scipy导入垫、矩阵、集成
从scipy.integrate导入四元组
将numpy作为np导入
从numpy进口linalg作为la
导入操作系统
从matplotlib导入pyplot作为plt
#定义变量和函数
MP=浮子(9.10938356e-31)#电子质量,单位为kg
WL=浮球(1e-10)#井的长度(米)
CON=浮子(1.60218e-19)#恒定高度(焦耳)
Hb=浮点数(1.054571726e-34)#约化的普朗克常数,单位为J s
NB=int(输入(“基函数数”)#定义要使用的基集数
#####初始势能#####
PE=[]
对于范围(1,NB+1)内的j:
alist=[]
对于范围(1,NB+1)内的k:
F1=积分四元(λx:((2/WL)*np.sin((k*np.pi*x)/WL)*
(-CON)*np.sin(np.pi*x/WL))*np.sin((j*np.pi*x)/WL)),0,WL[0]
如果F1<-1e-25:
F1=F1
elif F1>1e-25:
F1=F1
其他:
F1=0
附加列表(F1)
PE.append(列表)
PEarray=np.asarray(PE)
#####初态动能#####
KE=[]
对于范围(1,NB+1)内的j:
blist=[]
对于范围(1,NB+1)内的k:
F2=integrate.quad(λx:((((Hb**2)*(j**2)*(np.pi**2))/(MP*(WL**3)))*
((np.sin(j*np.pi*x/WL))*(np.sin(k*np.pi*x/WL()))),0,WL[0]
如果F2<-1e-25:
F2=F2
elif F2>1e-25:
F2=F2
其他:
F2=0
blist.append(F2)
附加(blist)
KEarray=np.asarray(KE)
#####加上PE和KE得到初始状态的完整哈密顿量#####
#####然后将列表转换为numpy数组#####
总和=[0]*NB
对于范围内的i(NB):
总和[i]=[0]*NB
对于范围内的y(len(PEarray)):
对于范围内的z(len(PEarray[0]):
和[y][z]=PEarray[y][z]+KEarray[y][z]
npsum=np.asarray(总和)
EVal,EVec=八分之一(npsum)
Wavexns=[]
对于范围(1,NB+1)内的j:
clist=[]
对于范围(1,NB+1)内的k:
F3=(λx:((每个项目(k-1,j-1))*
(np.sin(((k+1)*np.pi)/WL)*x)))
clist.append(F3)
wavexns.append(clist)
npwavexns=np.asarray(wavexns)
方程=[]
对于范围(0,NB)内的j:
F4=np.和(NPX.项(j))
等式附加(F4)
npEQS=np.asarray(EQS)
对于范围(0,NB)内的j:
wfxn1=(λx:((npEQS.项目(j))(x)))
plt.xlabel(“盒子长度”)
plt.ylabel(“能源”)
x=np.linspace(0,WL,500)
plt.绘图(x,wfxn1(x),“--m”)
plt.show()

好的,据我所知,您遇到了两个问题。其中一个问题是您试图接管一系列函数的总和(以及与
npwavexns
相关的所有其他问题)

另一个问题是一个非常糟糕的问题,结果导致返回到分配给
F3
lambda
。简短的版本是,在
lambda
的“捕获”中使用循环变量
j
k
变量,以便以后调用
lambda
时可以使用它们。问题是这些变量的值可能会改变,就像循环每次迭代时
j
k
的值一样。当您实际调用这些
lambda
时,它们最终都使用了完全相同的
j和
k
(在本例中,这是它们在最后一个循环中的最终值)

我使用一种称为闭包(请参阅)的技术修复了
lambda
问题。简短的解释是,它允许您显式捕获变量的当前值以供以后使用

无论如何,这里有一个完整的代码工作示例。
wavexns=[]
行上方的所有内容都未被触及:

from scipy import mat, matrix, integrate
from scipy.integrate import quad
import numpy as np
from numpy import linalg as la
import os
from matplotlib import pyplot as plt

# Defining variables and functions
MP=float(9.10938356e-31)    #mass of electron in kg
WL=float(1e-10) #length of well in meters
CON=float(1.60218e-19)  #constant height in joules
Hb = float(1.054571726e-34) #reduced planck's constant in J s
NB=int(input("Number of basis functions ")) #define number of basis sets to be used

#####Potential energy of initial state#####
PE=[]
for j in range(1,NB+1):
    alist=[]
    for k in range(1,NB+1):
        F1=integrate.quad(lambda x:((2/WL)*np.sin((k*np.pi*x)/WL)*
        ((-CON)*np.sin(np.pi*x/WL))*np.sin((j*np.pi*x)/WL)),0,WL)[0]
        if F1 < -1e-25:
            F1=F1
        elif F1 > 1e-25:
            F1=F1
        else:
            F1=0
        alist.append(F1)
    PE.append(alist)
PEarray=np.asarray(PE)

#####Kinetic Energy of initial state#####
KE=[]
for j in range(1,NB+1):
    blist=[]
    for k in range(1,NB+1):
        F2=integrate.quad(lambda x:(((((Hb**2)*(j**2)*(np.pi**2))/(MP*(WL**3)))*
        ((np.sin(j*np.pi*x/WL))*(np.sin(k*np.pi*x/WL))))),0,WL)[0]
        if F2 < -1e-25:
            F2=F2
        elif F2 > 1e-25:
            F2=F2
        else:
            F2=0
        blist.append(F2)
    KE.append(blist)
KEarray=np.asarray(KE)

#####Adding PE and KE to give the full hamiltonian of the initial state#####
#####Then convert the list to a numpy array#####
sum=[0]*NB
for i in range(NB):
    sum[i]=[0]*NB
for y in range(len(PEarray)):
    for z in range(len(PEarray[0])):
        sum[y][z]=PEarray[y][z]+KEarray[y][z]
npsum=np.asarray(sum)

EVal, EVec=la.eigh(npsum)

wavefxns=[]
for j in range(0,NB):
    clist=[]
    for k in range(0,NB):
        F3 = (lambda a,b: (lambda x: ((EVec.item(b-1, a-1)) * (np.sin((((b+1)*np.pi)/WL)*x)))))(j,k)
        clist.append(F3)
    wavefxns.append(clist)

gridspec_kw = {'wspace': 0, 'hspace': 0}
fig,axarr = plt.subplots(NB, sharex=True, squeeze=False, gridspec_kw=gridspec_kw, figsize=(3,7.5))
fig.subplots_adjust(left=0, bottom=0, right=1, top=1)

for j,ax in zip(range(0,NB), axarr.ravel()):
    wfxn = lambda x: np.sum([wavefxns[i][j](x) for i in range(len(wavefxns))], axis=0)
    if j==(NB - 1):
        ax.set_xlabel("Box length")
    ax.set_ylabel("energy")
    x = np.linspace(0,WL,500)
    ax.plot(x, wfxn(x), '--m')
来自scipy导入垫、矩阵、集成
从scipy.integrate导入四元组
将numpy作为np导入
从numpy进口linalg作为la
导入操作系统
从matplotlib导入pyplot作为plt
#定义变量和函数
MP=浮子(9.10938356e-31)#电子质量,单位为kg
WL=浮球(1e-10)#井的长度(米)
CON=浮子(1.60218e-19)#恒定高度(焦耳)
Hb=浮点数(1.054571726e-34)#约化的普朗克常数,单位为J s
NB=int(输入(“基函数数”)#定义要使用的基集数
#####初始势能#####
PE=[]
对于范围(1,NB+1)内的j:
alist=[]
对于范围(1,NB+1)内的k:
F1=积分四元(λx:((2/WL)*np.sin((k*np.pi*x)/WL)*
(-CON)*np.sin(np.pi*x/WL))*np.sin((j*np.pi*x)/WL)),0,WL[0]
如果F1<-1e-25:
F1=F1
elif F1>1e-25:
F1=F1
其他:
F1=0
附加列表(F1)
PE.append(列表)
PEarray=np.asarray(PE)
#####初态动能#####
KE=[]
对于范围(1,NB+1)内的j:
blist=[]
对于范围(1,NB+1)内的k:
F2=integrate.quad(λx:((((Hb**2)*(j**2)*(np.pi**2))/(MP*(WL**3)))*
((np.sin(j*np.pi*x/WL))*(np.sin(k*np.pi*x/WL()))),0,WL[0]
如果F2<-1e-25:
F2=F2
elif F2>1e-25:
F2=F2
其他:
F2=0
blist.append(F2)
附加(blist)
KEarray=np.asa
from scipy import mat, matrix, integrate
from scipy.integrate import quad
import numpy as np
from numpy import linalg as la
import os
from matplotlib import pyplot as plt

# Defining variables and functions
MP=float(9.10938356e-31)    #mass of electron in kg
WL=float(1e-10) #length of well in meters
CON=float(1.60218e-19)  #constant height in joules
Hb = float(1.054571726e-34) #reduced planck's constant in J s
NB=int(input("Number of basis functions ")) #define number of basis sets to be used

#####Potential energy of initial state#####
PE=[]
for j in range(1,NB+1):
    alist=[]
    for k in range(1,NB+1):
        F1=integrate.quad(lambda x:((2/WL)*np.sin((k*np.pi*x)/WL)*
        ((-CON)*np.sin(np.pi*x/WL))*np.sin((j*np.pi*x)/WL)),0,WL)[0]
        if F1 < -1e-25:
            F1=F1
        elif F1 > 1e-25:
            F1=F1
        else:
            F1=0
        alist.append(F1)
    PE.append(alist)
PEarray=np.asarray(PE)

#####Kinetic Energy of initial state#####
KE=[]
for j in range(1,NB+1):
    blist=[]
    for k in range(1,NB+1):
        F2=integrate.quad(lambda x:(((((Hb**2)*(j**2)*(np.pi**2))/(MP*(WL**3)))*
        ((np.sin(j*np.pi*x/WL))*(np.sin(k*np.pi*x/WL))))),0,WL)[0]
        if F2 < -1e-25:
            F2=F2
        elif F2 > 1e-25:
            F2=F2
        else:
            F2=0
        blist.append(F2)
    KE.append(blist)
KEarray=np.asarray(KE)

#####Adding PE and KE to give the full hamiltonian of the initial state#####
#####Then convert the list to a numpy array#####
sum=[0]*NB
for i in range(NB):
    sum[i]=[0]*NB
for y in range(len(PEarray)):
    for z in range(len(PEarray[0])):
        sum[y][z]=PEarray[y][z]+KEarray[y][z]
npsum=np.asarray(sum)

EVal, EVec=la.eigh(npsum)

wavefxns=[]
for j in range(0,NB):
    clist=[]
    for k in range(0,NB):
        F3 = (lambda a,b: (lambda x: ((EVec.item(b-1, a-1)) * (np.sin((((b+1)*np.pi)/WL)*x)))))(j,k)
        clist.append(F3)
    wavefxns.append(clist)

gridspec_kw = {'wspace': 0, 'hspace': 0}
fig,axarr = plt.subplots(NB, sharex=True, squeeze=False, gridspec_kw=gridspec_kw, figsize=(3,7.5))
fig.subplots_adjust(left=0, bottom=0, right=1, top=1)

for j,ax in zip(range(0,NB), axarr.ravel()):
    wfxn = lambda x: np.sum([wavefxns[i][j](x) for i in range(len(wavefxns))], axis=0)
    if j==(NB - 1):
        ax.set_xlabel("Box length")
    ax.set_ylabel("energy")
    x = np.linspace(0,WL,500)
    ax.plot(x, wfxn(x), '--m')