在 2D numpy 数组中查找沿 x 和 y 的标准差

问题描述 投票:0回答:2

如果我有一个由点 (x, y) 组成的 2D numpy 数组,每个点给出一些值 z(x, y),我可以找到沿 x 轴和沿 y 轴的标准差吗?我知道

np.std(data)
只会找到整个数据集的标准差,但这不是我想要的。此外,添加
axis=0
axis=1
可以计算您拥有的尽可能多的行或列沿每个轴的标准偏差。如果我只想要一个沿 y 轴的标准差,另一个沿 x 轴的标准差,我可以在这样的数据集中找到这些吗?根据我的理解,当点 x 的值为 y(x) 时,沿 x 和 y 的标准差通常是有意义的。但我需要一些
sigma_x
sigma_y
来实现我想要做的 2D 高斯拟合。这可能吗?

这是一个过于简单的示例,因为我的实际数据要大得多。

import numpy as np
data = np.array([[1, 5, 0, 3], [3, 5, 1, 1], [41, 33, 9, 20], [11, 20, 4, 13]])

print(np.std(data)) #not what I want
>>> 11.78386 

print(np.std(data, axis=0)) #this gives me as many results as there are rows/columns so it's not what I want
>>> [16.03 11.69 3.5 7.69]

我不确定与我想要的内容相对应的输出是什么样子,因为我什至不确定它是否可能在形状> nx2的2D数组中。但我想知道是否可以计算沿 x 轴的标准差和沿 y 轴的标准差。我什至不确定这对于 2D 数组是否有意义...但如果没有,我不确定要输入什么作为 2D 高斯拟合的

sigma_x
sigma_y

python arrays python-3.x numpy standard-deviation
2个回答
0
投票

标准差不关心

y = f(x)
(x, y)
是否是坐标。它只是衡量一组值的分布程度。如果你有
n
(x, y)
组成了
nX2
大小的数组,那么
std(axis=0)
就是你想要的。它创建一个
(2, )
形数组,其中第一个元素是 x 轴 std,第二个元素是 y 轴 std。这是否有用,取决于你想要什么,它忽略了
x
y
之间的相关性。


0
投票

我认为你想要的是以小间隔分隔 x 轴,并计算这些间隔内点的 y 坐标的标准偏差。 您可以计算 std(y_i),其中 y_i 是区间 (x_min+i*delta_x, x_min+(i+1)*delta_x) 中点 x 的 y 坐标,选择一个小的 delta_x,这样就有足够的点 (x_j, y_j ) 位于区间内。

import numpy as np
x = np.array([0, 0.11, 0.1, 0.01, 0.2, 0.22, 0.23])
y = np.array([1, 2, 3, 2, 2, 2.1, 2.2])
num_intervals = 3
#sort the arrays
sort_inds = np.argsort(x)
x = x[sort_inds]
y = y[sort_inds]
# create intervals
x_range = x.max() - x.min()
x_intervals = np.linspace(np.min(x)+x_range/num_intervals, x.max()-x_range/num_intervals, num_intervals)
print(x_intervals)
>> [0.07666667 0.115      0.15333333] 

接下来,我们使用这些间隔分割数组 y 和 x:

# get indices of x where the elements of x_intervals 
# should be inserted, in order to maintain the order  
# for sufficiently large num_intervals it 
# approximates the closest value in x to an element 
# in x_intervals
split_indices = np.unique(np.searchsorted(x, x_intervals, side='left')) 
ls_of_arrays_x = np.array_split(x, split_indices)
ls_of_arrays_y = np.array_split(y, split_indices)
print(ls_of_arrays_x)
print(ls_of_arrays_y)
>> [array([0.  , 0.01]), array([0.1 , 0.11]), array([0.2 , 0.22, 0.23])]
>> [array([1., 2.]), array([3., 2.]), array([2. , 2.1, 2.2])]

现在计算 x 坐标和相应的 y 标准:

y_stds = np.array([np.std(yi) for yi in ls_of_arrays_y])
x_mean = np.array([np.std(xi) for xi in ls_of_arrays_x])
print(x_mean)
print(y_stds)
>> [0.005      0.105      0.21666667]
>> [0.5        0.5        0.08164966]

我希望这是您正在寻找的。

© www.soinside.com 2019 - 2024. All rights reserved.