C# 用Math.Net计算一些统计数据

C# 用Math.Net计算一些统计数据,c#,arrays,list,multidimensional-array,mathnet-numerics,C#,Arrays,List,Multidimensional Array,Mathnet Numerics,我有一些结果存储在多维数组中: double[,] results; 每列都是特定变量(如“房屋”、“汽车”、“电力”)的价格时间序列。我想计算每个变量的一些统计数据,以便以更紧凑的形式总结结果。 例如,我在看Math.Net中的百分位函数 我想计算每列价格的第90个百分位(每个变量也是如此) 我正在尝试以下操作,因为该函数不适用于多维数组(因此我无法将结果[,]作为percentile函数的参数传递): for(int i=0,i是一个包含以下内容的函数: 你可以让Linq帮你列清单

我有一些结果存储在多维数组中:

double[,] results;
每列都是特定变量(如“房屋”、“汽车”、“电力”)的价格时间序列。我想计算每个变量的一些统计数据,以便以更紧凑的形式总结结果。 例如,我在看Math.Net中的百分位函数

我想计算每列价格的第90个百分位(每个变量也是如此)

我正在尝试以下操作,因为该函数不适用于多维数组(因此我无法将结果[,]作为percentile函数的参数传递):

for(int i=0,i是一个包含以下内容的函数:

你可以让Linq帮你列清单

        var myList= query.ToList();
或者将其添加到预先存在的列表中:

        myList.AddRange(query);
更新

要过滤
NaN
值,请使用:

更新

如果提取了两个阵列扩展:

public static class ArrayExtensions
{
    public static IEnumerable<IEnumerable<T>> Columns<T>(this T[,] array)
    {
        if (array == null)
            throw new ArgumentNullException();
        return Enumerable.Range(0, array.GetLength(1))
            .Select(iCol => Enumerable.Range(0, array.GetLength(0))
                .Select(iRow => array[iRow, iCol]));
    }

    public static IEnumerable<IEnumerable<T>> Rows<T>(this T[,] array)
    {
        if (array == null)
            throw new ArgumentNullException();
        return Enumerable.Range(0, array.GetLength(0))
            .Select(iRow => Enumerable.Range(0, array.GetLength(1))
                .Select(iCol => array[iRow, iCol]));
    }
}

这似乎更清楚。

哇,这很好。但我在结果中得到了一些NaN。这可能是因为时间序列中有一些NaN。我如何修改查询以避免这种NaN?谢谢。@mickG-Filter with
double.IsNan()
。感谢您的帮助。这一切正常工作。
        var myList= query.ToList();
        myList.AddRange(query);
        var query = Enumerable.Range(0, results.GetLength(1))
            .Select(iCol => Enumerable.Range(0, results.GetLength(0))
                .Select(iRow => results[iRow, iCol])
                .Where(d => !double.IsNaN(d))
                .Percentile(90));
public static class ArrayExtensions
{
    public static IEnumerable<IEnumerable<T>> Columns<T>(this T[,] array)
    {
        if (array == null)
            throw new ArgumentNullException();
        return Enumerable.Range(0, array.GetLength(1))
            .Select(iCol => Enumerable.Range(0, array.GetLength(0))
                .Select(iRow => array[iRow, iCol]));
    }

    public static IEnumerable<IEnumerable<T>> Rows<T>(this T[,] array)
    {
        if (array == null)
            throw new ArgumentNullException();
        return Enumerable.Range(0, array.GetLength(0))
            .Select(iRow => Enumerable.Range(0, array.GetLength(1))
                .Select(iCol => array[iRow, iCol]));
    }
}
        var query = results.Columns().Select(col => col.Where(d => !double.IsNaN(d)).Percentile(90));