2

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

如果我想获得 2d 数组 A2 的分区(例如 A1=A2[2,:] 类型)(即 2d 数组的 1d 实例),我可以这样做(设置第一维的索引,例如到 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} }

4

2 回答 2

1

LINQ in general doesn't play too well with multi-dimensional arrays. The operations are inherently single dimensional. It plays much better with nested single dimensional arrays, so if you wanted to return a jagged array of depth two, i.e. a double[][] rather than a double[,] LINQ is a more appropriate tool.

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-21T19:32:08.570 回答
0

像这样的东西应该适用于 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;
}
于 2013-03-21T19:47:08.967 回答