我写了一个小程序来执行以下操作:
list
本地最小值我想把它变成一个函数,所以我做了同样的事情,比方说10行,这样我就可以绘制所有这些行的像素值,而不必运行程序10次。
代码如下所示:
from astropy.io import fits
import matplotlib.pyplot as plt
import numpy as np
hdulist = fits.open('xbulge-w1.fits') # Open FITS file as image
w1data = hdulist[0].data
height = w1data.shape[0] # Inspect height of image
width = w1data.shape[1]
def plot_envelope(image, image_height):
index = np.random.randint(0, height/2) # Select random number in upper half
row = w1data[index] # Look at row number
local_minima = []
# Find local minimum, and add to list of minimum-valued pixels
for i in range(1, width-1):
if w1data[index][i-1] > w1data[index][i]:
if w1data[index][i+1] > w1data[index][i]:
local_minima.append(w1data[index][i])
else:
continue
return (local_minima, row, index)
plot_envelope(w1data, height)
x1 = range(width)
plt.plot(x1, row, color = 'r', linewidth = 0.5)
plt.title('Local envelope for row ' + str(index))
plt.xlabel('Position')
plt.ylabel('Pixel value')
plt.show()
如果我不使用函数定义(例如index
,row
和local_minima
以及嵌套for
循环的声明是该计划的main
部分。使用如图所示的函数定义,它会返回NameError: name 'local_minima' is not defined
错误
由于我将这些变量传递出函数,我不应该在程序的其余部分使用它们吗?
我错过了关于局部变量和全局变量的内容吗?
答案 0 :(得分:0)
当你致电plot_envelope(w1data, height)
时,你告诉函数将w1data和height分配给image和image_heigth。在函数内部,您应该使用w1data
虚拟变量操作image
(更改函数内图像的w1data),该范围仅在函数内部。接下来你应该在变量中得到函数的结果(return):envelope = plot_envelope(w1data, height)
然后是local_minima = envelope[0], row = envelope[1], index = envelope[2]
。