python,绘制通过数组循环的普朗克曲线

python,绘制通过数组循环的普朗克曲线,python,for-loop,multidimensional-array,Python,For Loop,Multidimensional Array,我试图让自己熟悉python编程,但我刚刚开始,正在努力解决以下问题。也许有人可以给我一个如何继续的提示,或者我可以在哪里找到一个好的解决方案 我想通过一个循环中的一个循环来绘制6种不同温度下132个波长的普朗克曲线。函数planckwavel接收两个参数,波长和温度,我将它们分为两个循环 到目前为止,我成功地使用了列表,但可能无法以优雅的方式解决: plancks = [] temp = [280, 300, 320, 340, 360, 380] temp_len = len(temp)

我试图让自己熟悉python编程,但我刚刚开始,正在努力解决以下问题。也许有人可以给我一个如何继续的提示,或者我可以在哪里找到一个好的解决方案

我想通过一个循环中的一个循环来绘制6种不同温度下132个波长的普朗克曲线。函数planckwavel接收两个参数,波长和温度,我将它们分为两个循环

到目前为止,我成功地使用了列表,但可能无法以优雅的方式解决:

plancks = []
temp = [280, 300, 320, 340, 360, 380]
temp_len = len(temp)

### via fun planckwavel
for i in range(temp_len):
    t_list = [] # list nach jeder j schleife wieder leeren
    for j in range(wl_centers_ar.shape[0]):
        t = planckwavel(wl_centers_ar[j],temp[i])
        t_list.append(t)      
    plancks.append(t_list)


### PLOT Planck curves

plancks = np.array(plancks).T # convert list to array and transpose

view_7 = plt.figure(figsize=(8.5, 4.5))
plt.plot(wl_centers_ar,plancks)
plt.xticks(rotation='vertical')
但我希望使用数组而不是列表,因为我喜欢在之后继续使用更大的维度图像。因此,我尝试对数组执行相同的操作,但不幸的是,使用以下代码失败:

plancks_ar = zeros([132,6], dtype=float ) # create array and fill with zeros
temp_ar = array([273, 300, 310, 320, 350, 373])

for i in range(temp_ar.shape[0]):
    t_ar = np.zeros(plancks_ar.shape[0])
    for j in range(plancks_ar.shape[0]):
        t = planck(wl_centers_ar[j]*1e-6,temp[1])/10**6
        np.append(t_ar,t)        
    np.append(plancks_ar, t_ar)

plt.plot(wl_centers_ar,plancks)
如果有人能给我一些建议,我将非常感激

Thanx, 致以最良好的祝愿


彼得

我想你是在问如何使用NumPy's。下面是一种删除显式Python循环的方法:

import numpy as np

# Some physical constants we'll need
h, kB, c = 6.626e-34, 1.381e-23, 2.998e8

def planck(lam, T):
    # The Planck function, using NumPy vectorization
    return 2*h*c**2/lam**5 / (np.exp(h*c/lam/kB/T) - 1)

# wavelength array, 3 - 300 um
lam = np.linspace(3, 75, 132)
# temperature array
T = np.array([280, 300, 320, 340, 360, 380])
# Remember to convert wavelength from um to m
pfuncs = planck(lam * 1.e-6, T[:,None])

import pylab
for pfunc in pfuncs:
    pylab.plot(lam, pfunc)
pylab.show()

我们要计算每个波长和每个T的
planck
,因此我们需要在两个阵列上广播计算结果。按照上面链接的文档中列出的规则,我们可以通过向温度阵列添加一个新轴(使用
T[:,None]
):


T[:,None]
的最终维度是1,因此
lam
的132个值可以在其上广播,以生成一个
6x132
数组:6行(每T一行)的132个值(波长)。

我试图使用倒数(亮度温度)来双重检查上述普朗克方程。根据您的代码,我定义了以下功能,预计将获得300开尔文(@10微米,对于10 W/m2/str/微米):

但是得到了一个奇怪的结果

planckInv(10,10)
->3.0039933569668916e-08

有什么建议我的亮度温度功能有什么问题吗

谢谢,
peter

这确实是一个单独的问题,但由于不太可能在stackoverlow(!)上得到答案,简短的回答是重新排列的等式是错误的:最后一行应该是
return(h*c/kB/lam)*(1/np.log((2*h*c**2/lam**5)/rad+1))
lam:       132
T      6 x   1
--------------
       6 x 132
def planckInv(lam, rad): 
     rad=rad*1.e6 #convert to W/m^2/m/sr 
     lam=lam*1.e-6 #convert wavelength to m 
     return (h*c/kB*lam)*( 1/ np.log( (2*h*c**2/lam**5) / rad +1 ))