我有一堆点定义为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。
任何人都知道如何避免像这样迭代?
答案 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的一般规则,也适用于算术运算。