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

时间:2018-11-12 22:57:01

标签: python arrays numpy stored-functions python-3.7

很抱歉,是否曾经有人问过这个问题。我是python和程序设计的新手,因此如果有人提出要求,请向我指出正确的方向。我正在使用python 3.7。

我有一个2D numpy数组,其中每个元素都是一个存储函数。我想在每列中添加函数以获得一维数组,其中一维数组的元素是单个函数。我不确定为什么np.sum()函数不能执行此操作。我得到了一维数组,但函数仅来自“ npwavefxns”数组的第一列。

[[X 00 ,X 01 ,...,X 0n ]

[X 10 ,X 11 ,...,X 1n ]

...

[X n0 ,X n1 ,... [X nn ]]

-> [[X 00 + X 10 + ... + X n0 ,X 01 + X 11 + ... + X n1 ,X 0n + X 1n + ... + X nn ]]

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

First plot second plot third plot fourth plot

SELECT 
    ChargeAccount.ClientID, 
    Sale.SaleNo, 
    Sale.SaleDate, 
    Sale.LastName, 
    ChargeAccount.ChargeAmt, 
    Sale.FirstName, 
    Sale.MI, 
    Sale.StreetAddress, 
    Sale.City,
    Sale.State, 
    Sale.ZipCode, 
    Sale.SaleTotal, 
    ChargeAccount.ChDate
FROM 
    (ChargeAccount INNER JOIN Sale ON ChargeAccount.SaleNo = Sale.SaleNo) 
    INNER JOIN
    (
        SELECT t.ClientID
        FROM ChargeAccount t
        GROUP BY t.ClientID
        HAVING SUM(t.ChargeAmt) <> 0
    ) s ON ChargeAccount.ClientID = s.ClientID
ORDER BY 
    Sale.LastName, ChargeAccount.ChargeAmt DESC; 

1 个答案:

答案 0 :(得分:0)

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

另一个问题是一个很臭的问题,原来是导致您回到分配给lambda的{​​{1}}的问题。简短的版本是您在F3中使用了循环变量jklambda的“捕获”变量,因此以后调用lambda时可以使用它们。问题在于,这些变量的值可以更改,就像循环的每次迭代中lambdaj的值一样。在您实际调用这些k时,它们最终都使用了完全相同的lambdasj值(在这种情况下,它们是最后一个值循环)。

我使用一种称为闭包的技术解决了k问题(请参见this thread for more details)。简短的解释是,它允许您显式捕获变量的当前值以供以后使用。

无论如何,这是您的代码的完整工作示例。 lambda行上方的所有内容均保持不变:

wavefxns=[]

哪个(当您运行它并输入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') 时)会产生输出:

enter image description here

我调整了绘图例程,以便所有波函数都可以绘制到一个图形上(因此,我只有一个图形可以复制/粘贴到此答案中)。