2

3次元配列から2次元配列を取得したい。次元 [10,10,10] の double 3d 配列 A3 があるとします。2d
配列 A2 = A3[:,5,:] を取得する必要があります。つまり、2 番目の次元のインデックスが 5 に等しい場合です。

2 次元配列 A2 (つまり、2 次元配列の 1 次元インスタンス) のパーティション (たとえば、種類 A1=A2[2,:]) を取得したい場合は、これを行うことができます (1 次元のインデックスは、たとえば次のように設定されます)。に 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 は多次元配列ではうまく機能しません。操作は本質的に 1 次元です。入れ子になった 1 次元配列との相性が良いため、深さ 2 のギザギザ配列を返したい場合、つまりLINQdouble[][]ではなくa の方が適切なツールです。double[,]

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 に答える