【问题标题】:Finding standard deviations along x and y in 2D numpy array在 2D numpy 数组中沿 x 和 y 查找标准差
【发布时间】:2022-02-17 03:35:31
【问题描述】:

如果我有一个由点 (x, y) 组成的二维 numpy 数组,在每个点上给出一些值 z(x, y),我可以找到沿 x 轴和沿 y 轴的标准偏差吗?我知道np.std(data) 只会找到整个数据集的标准差,但这不是我想要的。此外,添加axis=0axis=1 会计算您拥有的行或列沿每个轴的标准偏差。如果我只想要一个沿 y 轴的标准偏差,另一个沿 x 轴的标准偏差,我可以在这样的数据集中找到它们吗?据我了解,当点 x 的值为 y(x) 时,沿 x 和 y 的标准偏差通常是有意义的。但我需要一些sigma_xsigma_y 来进行我想要做的二维高斯拟合。这可能吗?

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

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 的二维数组中是否可能。但我想知道是否可以计算沿 x 轴的标准偏差和沿 y 轴的标准偏差。我什至不确定这对二维数组是否有意义......但如果没有,我不确定输入什么作为我的sigma_xsigma_y 以进行二维高斯拟合。

【问题讨论】:

  • 这只是一个坚实的文本块。请考虑将其分解为段落,并明确说明您要实现的目标
  • @roganjosh 查看编辑
  • 我完全不清楚您所说的“沿 x 轴的标准偏差”是什么意思。这包括哪些数组值?选择值并应用std 操作很简单,不是吗?
  • “沿 x 轴的标准差”唯一明显的含义是“每列的标准差”,这正是您所说的想要的.那么,你想要什么?也许您有一些预期的规则来将两行之间的距离作为一个浮点数,并且您想要使用该距离规则的标准偏差?如果是这样,您需要告诉我们该规则是什么,我们可以向您展示如何实施它。
  • 我认为我需要做的是在我的峰值所在的行或列处获得沿 x 和 y 的标准偏差。我认为这就是我正在阅读的示例缺乏解释的地方......在这种情况下,如果我的峰值有(x0,y0)坐标,我可能会做np.std(data, axis=0)[x0]np.std(data, axis=1)[y0]。但我不肯定这是否正确。

标签: python arrays python-3.x numpy standard-deviation


【解决方案1】:

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

【讨论】:

  • 谢谢——虽然我的数据集是二维数组,但它们没有形状 nx2。我正在处理不同形状的数据集,但假设我在一个名为 data 的 600x600 数组上进行操作。这种方法在这种情况下仍然有效吗?我认为这会给我 600 个结果?
  • 通常,数据集的形状是num_patterns X num_features,因此您需要沿轴=0 的标准差。另一方面,如果你有2Xn 形状,你想要std(axis=1)。在任何情况下,您都希望相同特征沿所有不同模式的标准差
  • 嗯,我明白了。在我刚刚添加到我的问题的简化示例中,如果我沿着axis=0 执行np.std,我当然会得到四个结果。我知道每个模式都有一个标准偏差,但是否可以将其减少到x 方向的一个标准偏差和y 的另一个标准偏差?
【解决方案2】:

我认为您想要的是以小间隔分隔 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]

我希望它是你要找的。​​p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 2015-09-18
    • 2020-09-09
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多