我想从三维数组中得到一个2d数组。假设我有一个维数为10,10,10的双3d数组A3
我需要得到一个2d数组A2 = A3 :,5,:,即第二维的索引等于例如5。
如果我想获得2d数组A2 (即2d数组的1d实例)的分区(例如,类A2,:),我可以这样做(第1维的索引设置为2):
double[] A1 = Enumerable.Range(0,A2.Length).Select(x=>A2[2,x]).ToArray();我怎样才能做到从3到2(或一般从N到N1)维度?
编辑.示例输入:
double[,,] A3 = new double[2,3,4]{
{
{4,3,2,1},
{5,4,3,2},
{6,5,4,3}
},
{
{1,2,3,4},
{2,3,4,5},
{3,4,5,6}
}
};结果数组A2=A3:,1,:必须有以下内容:{5,4,3,2},{2,3,4,5}
发布于 2013-03-21 19:32:08
一般来说,LINQ在多维数组中的表现并不太好。这些操作本质上是一维的。对于嵌套的一维数组,它的性能要好得多,因此,如果您想返回深度为2的锯齿状数组,即double[][]而不是double[,] LINQ是一个更合适的工具。
public static T[][] GetPlane<T>(T[, ,] source, int secondDimensionValue)
{
return Enumerable.Range(0, source.GetLength(0))
.Select(i => Enumerable.Range(0, source.GetLength(2))
.Select(j => source[i, secondDimensionValue, j])
.ToArray())
.ToArray();
}发布于 2013-03-21 19:47:08
像这样的东西应该适用于3->2:
static T[][] Collapse<T>(T[][][] array, int y)
{
return
Enumerable.Range(0, array.Length).Select(x =>
Enumerable.Range(0, array[x][y].Length).Select(z =>
array[x][y][z]
).ToArray()
).ToArray();
}如何将这种模式扩展到更高维度的问题应该是相当明显的。
编辑:
这将以预期的方式扩展到多维数组。如果您对返回多维数组(相对于锯齿数组)感兴趣,那么LINQ可能不是解决这个问题的工具,因为它没有为处理多维数组创建提供明显或直观的方法。
如果您真的希望多维数组作为输出,我已经包含了一个示例"deburr“实现,该实现应该将其折叠回多维(无锯齿)数组。
static T[][] Collapse<T>(T[,,] array, int y)
{
return
Enumerable.Range(0, array.GetLength(0)).Select(x =>
Enumerable.Range(0, array.GetLength(2)).Select(z =>
array[x,y,z]
).ToArray()
).ToArray();
}
static T[,] Deburr<T>(T[][] jagged)
{
T[,] mArray = new T[jagged.Length, jagged.Max(array => array.Length)];
foreach (int row in Enumerable.Range(0, jagged.Length))
foreach (int col in Enumerable.Range(0, jagged[row].Length))
mArray[row, col] = jagged[row][col];
return mArray;
}https://stackoverflow.com/questions/15556358
复制相似问题