rslt ← indx ##.from array ⍝ Select (1↓⍴⍵)-cells from array ⍵. Gianluigi Quario suggests [from], an alternative to "square-bracket" indexing: array[···;···;···]. [indx] is a vector of simple indices, each item of which selects along an axis of [array]. In other words: (inx1 inx2 ···) from array ←→ array[inx1;inx2;···] The number of items in [indx] must equal the rank of [array]: (⍴indx) ≡ ⍴⍴array The shape of [rslt] is the concatenation of the shapes of the items of [indx]: (⍴rslt) ≡ ↑,/⍴¨indx A special short-hand "null": (,⊂⍬) may be used for any item of the index vector to mean "all items along this axis". It is equivalent to an elided subscript ;; in conventional square-bracket indexing. Technical notes: Apart from the expansion of null indices, this function could be coded succinct- ly by converting to "choose" indexing, using an outer product reduction of the index arrays: from←{ ⍵[↑∘.,/⍺] } As selecting from a scalar array requires a zero-length index, we must pad the reduction's argument with a dummy item to avoid a domain error: from←{ ⍵[1↓¨↑∘.,/0,⍺] } │ │ ││ ├─┘ ├┘ │ └──── prefix dummy item. └──────────── remove dummy items. ⍬ from 42 ⍝ null select from scalar. 42 Purists who find square bracket indexing offensive (gnomoparenthiphobes? tetra- claustrophobes?), might prefer to use the "pick each enclose" (chipmunk) idiom: from←{ (⊂¨1↓¨↑∘.,/0,⍺)⊃¨⊂⍵ } We could extend our function to accommodate null indices by borrowing from the →select← function, although this would complicate and slow down the coding, con- siderably. from←{ (⊂¨1↓¨↑∘.,/0,(⎕IO+⍺∊⊂,⊂⍬)⊃¨↑,¨/⊂¨¨⍺(⍳¨⍴⍵))⊃¨⊂⍵ } ├────────┘ ├───────┘│ ├──┘ │ │ │ └──── full index vector per axis. │ │ └────── supplied index vector. │ └─────────────── select expanded nulls. └────────────────────────── nulls in index vector. Examples: _←,⊂⍬ ⍝ special value: select all items along axis. ⎕←a3←⍉10⊥⍉↑⍳3 4 5 ⍝ a3 is a rank-3 array. 111 112 113 114 115 121 122 123 124 125 131 132 133 134 135 141 142 143 144 145 211 212 213 214 215 221 222 223 224 225 231 232 233 234 235 241 242 243 244 245 311 312 313 314 315 321 322 323 324 325 331 332 333 334 335 341 342 343 344 345 1 2 3 from a3 ⍝ a3[1;2;3] 123 1 2 _ from a3 ⍝ a3[1;2;] 121 122 123 124 125 1 _ _ from a3 ⍝ a3[1;;] 111 112 113 114 115 121 122 123 124 125 131 132 133 134 135 141 142 143 144 145 _ 2 _ from a3 ⍝ a3[;2;] 121 122 123 124 125 221 222 223 224 225 321 322 323 324 325 (2 1)_ _ from a3 ⍝ a3[2 1;;] 211 212 213 214 215 221 222 223 224 225 231 232 233 234 235 241 242 243 244 245 111 112 113 114 115 121 122 123 124 125 131 132 133 134 135 141 142 143 144 145 (2 2⍴2 1)_ _from a3 ⍝ a3[2 2⍴2 1;;] 211 212 213 214 215 221 222 223 224 225 231 232 233 234 235 241 242 243 244 245 111 112 113 114 115 121 122 123 124 125 131 132 133 134 135 141 142 143 144 145 211 212 213 214 215 221 222 223 224 225 231 232 233 234 235 241 242 243 244 245 111 112 113 114 115 121 122 123 124 125 131 132 133 134 135 141 142 143 144 145 _ 2 _ from a3 ⍝ a3[;2;] 121 122 123 124 125 221 222 223 224 225 321 322 323 324 325 _ _ 2 from a3 ⍝ a3[;;2] 112 122 132 142 212 222 232 242 312 322 332 342 _ _ (2 2⍴2 1)from a3 ⍝ a3[;;2 2⍴2 1] 112 111 112 111 122 121 122 121 132 131 132 131 142 141 142 141 212 211 212 211 222 221 222 221 232 231 232 231 242 241 242 241 312 311 312 311 322 321 322 321 332 331 332 331 342 341 342 341 ⍴(,1)(,2)(,3) from a3 ⍝ rank-3 result. 1 1 1 ⍴(,1)( 2)(,3) from a3 ⍝ rank-2 result. 1 1 ⍴( 1)( 2)(,3) from a3 ⍝ rank-1 result. 1 ⍴( 1)( 2)( 3) from a3 ⍝ rank-0 result. (⊂2 2⍴2 1 1)from'hello' 'world' ⍝ works for nested arg. world hello hello world See also: select Back to: contents Back to: Workspaces