避免迭代数组

时间:2013-04-13 19:37:43

标签: ruby narray

我有一堆点定义为2x2 NArrays,我似乎无法弄清楚如何避免迭代。这就是我的工作:

# Instantiate an example point
point = NArray[[4, 9], [1, 1]]
# Create a blank array to fill
possible_points = NArray.int(2, 2, 16)
possible_points.shape[0].times do |i|
  possible_points[i, 0, true] = point[i, 0]
end

这会创建一个看起来像

的NArray
[ [ [ 4, 9 ],
    [ 0, 0 ] ],
  [ [ 4, 9 ],
    [ 0, 0 ] ],
    ...

在最后一个维度中的所有16个元素。

然而,我想要的是这样的:

possible_points[true, 0, true] = point[true, 0]

这种迭代排除了数字矢量库的目的。它也是两行代码而不是一行。

基本上,第一个例子(有效的例子)允许我在大小为1的NArray上分配一个数字,n。第二个例子(不起作用的那个)踢回错误,因为我试图将大小为2的NArray分配给大小为2的位置,n。

任何人都知道如何避免像这样迭代?

1 个答案:

答案 0 :(得分:2)

point = NArray[[4, 9], [1, 1]]
=> NArray.int(2,2): 
[ [ 4, 9 ], 
  [ 1, 1 ] ]

possible_points = NArray.int(2, 2, 16)

possible_points[true,0,true] = point[true,0].newdim(1)

possible_points
=> NArray.int(2,2,16): 
[ [ [ 4, 9 ], 
    [ 0, 0 ] ], 
  [ [ 4, 9 ], 
    [ 0, 0 ] ], 
  [ [ 4, 9 ], 
    [ 0, 0 ] ], 
  [ [ 4, 9 ], 
    [ 0, 0 ] ], 
  [ [ 4, 9 ], 
    [ 0, 0 ] ], 
 ...

将shape-N narray存储为shape-NxM narray, 从shape = [N]转换为shape = [N,1]。 在shape = [N,M]和shape = [N,1]之间的操作中, 重复使用size = 1轴的元素。 这是NArray的一般规则,也适用于算术运算。