Python astropy中窗口变异系数的计算

Python astropy中窗口变异系数的计算,python,numpy,scipy,astropy,Python,Numpy,Scipy,Astropy,我有一个数组,我想计算使用astropy的统计数据。我得到的是: from astropy.convolution import convolve import numpy as np x = np.random.randint(1, 10, size=(5, 5)) y = convolve(x, np.ones((3, 3)), boundary='extend', preserve_nan=True) print(x) print(y) [[9 1 8 6 5] [4 2 1 8

我有一个数组,我想计算使用astropy的统计数据。我得到的是:

from astropy.convolution import convolve
import numpy as np

x = np.random.randint(1, 10, size=(5, 5))
y = convolve(x, np.ones((3, 3)), boundary='extend', preserve_nan=True)

print(x)
print(y)

[[9 1 8 6 5]
 [4 2 1 8 4]
 [2 8 4 6 6]
 [8 4 8 5 6]
 [7 3 1 2 3]]

[[5.33333333 4.77777778 4.55555556 5.66666667 5.33333333]
 [4.55555556 4.33333333 4.88888889 5.33333333 5.55555556]
 [4.66666667 4.55555556 5.11111111 5.33333333 5.66666667]
 [5.44444444 5.         4.55555556 4.55555556 4.77777778]
 [6.         4.66666667 3.22222222 3.44444444 3.66666667]]
y
中的每个元素是在
x
中围绕该位置绘制的3x3框的平均值。我想要的是变异系数(标准偏差除以平均值),而不是平均值。我不确定这是否可以在astropy中完成,或者我是否需要使用其他类似的工具

from scipy.stats import variation

Astropy建立在numpy和scipy的基础上。Numpy是一种低级别的阵列库,用于实现数据存储和基本操作,这些操作由较高级别的库(如scipy和astropy)使用。了解numpy阵列的工作原理将有助于您使用astropy

由于您希望在滚动窗口上进行统计,类似的操作将不会直接帮助您。它计算按轴分组的元素的统计信息,而不是元素的分组方式。您可以使用类似的方法模拟通过轴的滚动窗口,但这很危险,容易出错,而且效率不高。相反,我建议使用与您已经做过的类似的卷积方法

首先,记住方差可以表示为

var = sum(x^2) / N - (sum(x) / N)^2
让我们这样做:

kernel = np.ones((3, 3))
mean_x = convolve(x, kernel, boundary='extend', preserve_nan=True)
mean_square_x = convolve(x**2, kernel, boundary='extend', preserve_nan=True)
现在,每个窗口都有
sum(x)/N
,以及
sum(x^2)/N
。标准偏差只是方差的平方根:

std_x = np.sqrt(mean_square_x - mean_x**2)
您想要的结果是比率

result = std_x / mean_x
您可以更简洁地完成整个计算

m = convolve(x, kernel, boundary='extend', preserve_nan=True)
result = np.sqrt(convolve(x**2, kernel, boundary='extend', preserve_nan=True) - m**2) / m

Astopy、scipy等在引擎盖下使用numpy来存储数据并进行许多低级计算。由于我的答案不可避免地使用numpy操作,所以我为您添加了该标记。