将向量转换为整数

知道了多维数组的向量形状,我们如何将其转换为一维的新向量(通过展平多维数组)?

例如,考虑以下数组:

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 

一个带有1Darrays的示例(简单):

 arr = [ nil, "B", nil, nil, "A", nil, nil ] shape = [7] vector = [-3] vector2index(shape, vector) # => -3 

有没有一种简单的方法可以平滑任何维数组的向量? 谢谢。

首先,假设数组的第一个元素是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(:+) 

UPD。 更新问题后,它变得更加清晰。 如果要保留Ruby的索引顺序,则需要反转数组shapevector

 vector.reverse.each_with_index.map { |v, i| i == 0? v: v * shape[0..i-1].reverse.inject(:*) }.inject(:+)