繁体   English   中英

使用LINQ获取多维数组的分区(N维数组的(N-1)维实例)

[英]get partition ((N-1)-dimensional instance of the N-dimensional array) of a multidimensional array with LINQ

我想从3d数组中获取2d数组。 假设我有一个尺寸为[10,10,10]的双3d数组A3
我需要得到一个二维数组A2 = A3 [:,5 ,:],即第二维的索引等于例如5。

如果我想获得2d数组A2(即2d数组的1d实例)的分区(例如,A1 = A2 [2 ,:]类型的分区),我可以做到这一点(设置第一维的索引,例如至2):

double[] A1 = Enumerable.Range(0,A2.Length).Select(x=>A2[2,x]).ToArray();

我怎样才能将尺寸从3变为2(或通常从N到N-1)?

编辑 输入示例:

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}}

通常,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();
}

这样的事情应该适用于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可能不是解决该问题的工具,因为它没有提供明显或直观的方法来处理多维数组的创建。

如果您真的希望将多维数组作为输出,我提供了一个示例“去毛刺”实现,可以将其折叠回多维(无锯齿)数组。

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM