多次元配列のベクトルの形状を知っているので、どうすればそれを1次元の新しいベクトルに変換できますか(多次元配列を平坦化することによって)?
たとえば、次の配列を考えます。
arr = [
[
[ nil, nil ],
[ nil, nil ],
[ nil, nil ]
],
[
[ nil, nil ],
[ nil, nil ],
[ nil, nil ]
]
]
arr[0][0][0] = "A"
arr[1][0][1] = "B"
arr # =>
[
[
[ "A", nil ],
[ nil, nil ],
[ nil, nil ]
],
[
[ nil, "B" ],
[ nil, nil ],
[ nil, nil ]
]
]
...ここで、はベクトルA
の起点とB
終点です。書ける:
shape = [2, 3, 2]
vector = [1, 0, 1]
これから、平坦化すると仮定するとarr
、ベクトルをどのように変換できますか?言い換えれば、この3次元のベクトルを1次元の新しいベクトルに変換するにはどうすればよいでしょうか。
ベクトルの原点は配列の最初の座標でもあるため、これは特殊なケースです。したがって、次の結果を見つけることができます。
arr.flatten.index("B") # => 7
2D配列を使用した別の例を次に示します。
arr = [
[ "A", nil ],
[ "B", nil ],
[ nil, nil ],
[ nil, nil ],
[ nil, nil ]
]
私たちはこれを書くことができます:
shape = [2, 5]
vector = [1, 0]
そして、もう一度、
arr.flatten.index("B") # => 2
しかし、これは負のベクトルを使用した、より複雑な例です。
arr = [
[ "B", nil ],
[ "A", nil ],
[ nil, nil ],
[ nil, nil ],
[ nil, nil ]
]
shape = [2, 5]
vector = [-1, 0]
次のメソッドはどのように書くことができますか?
vector2index(shape, vector) # => -2
1D配列の例(単純):
arr = [ nil, "B", nil, nil, "A", nil, nil ]
shape = [7]
vector = [-3]
vector2index(shape, vector) # => -3
任意の次元の配列からベクトルをフラット化する簡単な方法はありますか?ありがとう。