2015-09-21 116 views
2

首先,一些代碼:APL附帶軸:⊂[n] A如何工作?

A ← 2 2 2 ⍴ ⍳8 
A 
0 1 
2 3 

4 5 
6 7 

⊂[0]A 
0 4 1 5 
2 6 3 7 

我可以想像在第一軸線包圍來表示子分片上其深度陣列,得到[[0 1][2 3]] & [[4 5][6 7]]或我可以看到它意義上的列的子分片,得到[[0 2][4 6]] & [[1 3][5 7]]。但當然它也沒有。 (⊂[1]A做第二次,什麼操作會做第一次?)

⊂[axis]array用於分割數組的底層算法是什麼?我已經繪製了幾張表格,看看我是否可以爲它構建一個直覺,但是我一直沒有能力,而且在我看過的文檔中找不到這些信息。

回答

3

我將使用基於一個索引 - 如果您想輸入,您可以設置「IO」。

軸規格中給出的尺寸是會受到影響的尺寸。也就是說,如果將第n維包圍起來,則秩將減小,因爲結果的形狀將是沒有第d維的原始形狀。

 ⍴a ← 2 3 4⍴⍬ 
2 3 4 
     ⍴⊂[1]a 
3 4 
     ⍴⊂[2]a 
2 4 
     ⍴⊂[3]a 
2 3 

現在,沿着Ñ第N維的陣列將保留在保留尺寸的地方,但作爲含有(即包圍)它們,產生一個嵌套陣列的標量:

 a ← 2 2 2⍴⍳8 
     a 
1 2 
3 4 

5 6 
7 8 
     ⊂[1]a 
┌→──┐ ┌→──┐ 
│1 5│ │2 6│ 
└───┘ └───┘ 
┌→──┐ ┌→──┐ 
│3 7│ │4 8│ 
└───┘ └───┘ 

⊂[axis]array正在使用的底層算法是什麼 拆分數組?我已經畫出了幾張表,看看我是否可以爲其構建 直覺,但是我一直沒有能力,而且我還沒有能夠 在我查看的文檔中找到這些信息。

對於你的例子,一個簡單的直覺可能是想象兩張半透明的印有他們的表格。你把它們放在彼此後面,稍微偏斜。然後,想象一下,如果你在他們面前擺放光源,會投射到他們身後的牆上。那預測,每個單元格中有兩個值的平坦表格就是你的結果。

我可以想像在第一軸線包圍來表示子分片上它的深度數組,得到[[0 1] [2 3]] & [[4 5] [6 7]或我所能 看到它意味着在列上進行子分割,產生[[0 2] [4 6]] & [[1 3] [5 7]]。但當然它也沒有。 (⊂[1]A做的 第二,

這不只是子切片 - 封裝返回一個嵌套的數組(除了簡單的標量),我不是誤解你的符號,或以下不明確:

 1 2 3 
1 2 3 
     ⍴1 2 3 
3    ⍝ rank 1, i.e. a vector 

     ≡⍴1 2 3 
1    ⍝ depth 1, i.e. a non-nested array 

     ⊂1 2 3 
┌→────┐ 
│1 2 3│ 
└─────┘ 
     ⍴⊂1 2 3 ⍝ rank 0, i.e. a scalar 
     ≡⊂1 2 3 
2    ⍝ depth >1, i.e. a nested array 

什麼操作會先做?)

您可以沿着一組尺寸的封裝:

⊂[2 3]a 
┌→──┐ ┌→──┐ 
↓1 2│ ↓5 6│ 
│3 4│ │7 8│ 
└───┘ └───┘ 

但是,上面Z ← ⊂[X]R⍴⍴Z ←→ (⍴⍴R)-⍴⍴X作爲解釋。

+0

非常感謝!我認爲我缺少的重要見解是它可能需要多個軸,並且它會返回一個rho-1向量數組而不是一個rho-1數組向量。我所猜測的[0] [1]&[2]其實是[1 2] [0 2]和[0 1]。真的應該檢查輸出的形狀,而不是假設'ngn'會在視覺上區分這兩種情況。 –

+0

很高興幫助。我沒有使用NGN,所以我不確定它是否可以顯示這些框。嘗試尋找像'] boxing或'⎕display'的東西。這真的有助於瞭解這個東西。 – danlei

+0

NGN APL僅使用原點零點([] IO 0),因此請務必相應地從所有軸規格(⊂[1 2] a)中取代⊂[2 3] a)中的一個。 – Lobachevsky