知道多维数组的向量形状,我们如何将其转换为一维的新向量(通过展平多维数组)?
例如,考虑以下数组:
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
是否有一种简单的方法可以从任何尺寸的数组中平移矢量?感谢。
答案 0 :(得分:0)
首先,假设数组的第一个元素是X轴,第二个 - 对于Y轴,第三个 - 对于Z轴,你在第二个和第三个例子中有一个错误。第三个例子应该是
shape = [2,5]
vector = [0,-1]
vector2index(shape, vector) # => -2
如果数组的第一个元素是Y轴,第二个 - 对于X轴,那么第二个和第三个例子是正确的,但第一个例子是错误的。
如果我理解了这个想法,我们需要在第一个示例中将vector[1]
乘以shape[0]
,将vector[2]
乘以shape[0]*shape[1]
,然后计算3个元素的总和。通常,我们不需要乘以第0个元素,我们需要将第n个元素乘以shape[0]*shape[1]*...*shape[n-1]
。
您可以这样实现:
vector.each_with_index.map {
|v, i| i == 0? v: v * shape[0..i-1].inject(:*)
}.inject(:+)
更新。更新问题后,它变得更加清晰。如果要保留Ruby的索引顺序,则需要反转数组shape
和vector
。
vector.reverse.each_with_index.map {
|v, i| i == 0? v: v * shape[0..i-1].reverse.inject(:*)
}.inject(:+)