2013-04-13 78 views
2

我有一堆定義爲2x2 NArrays的點,我似乎無法弄清楚如何避免迭代。下面是我有工作:避免迭代NArray

# 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,n的NArray分配一個數字。第二個示例(不起作用的示例)會返回錯誤,因爲我試圖將大小爲2的NArray分配給大小爲2的位置n。

任何人都知道我可以如何避免這樣的迭代?

+0

你的問題不清楚。向我們提供您擁有的輸入數據以及預期的輸出。 –

+0

什麼是數組''[true,0,true]'?給我們算法或功能說明 - 根據您的輸入,根據您的輸入,您要輸入什麼確切的輸出。 –

+0

迭代在我的初始代碼塊,'possible_points.shape [0] .times do | i |',給我正確的輸出。通常,使用NArray可以通過選擇true來爲整個維度指定一個值,但這對於在整個維度上分配NArray無效。 – acsmith

回答

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 ] ], 
... 

要存儲形狀-N narray塑造-N×M個narray, 從形狀轉換= [N]塑造= [N,1]。 在shape = [N,M]和shape = [N,1], 之間的操作中,size = 1軸處的元素將重複使用。 這是NArray的一般規則,也適用於算術運算。

+0

令人驚歎!非常感謝。 – acsmith