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 withdouble.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));