apldyalog

Access same row/column in each array in nested arrays in Dyalog APL


Is there a way to multiply or add a scalar to the same row or column in each array of a nested array without a loop? For example I would like to multiply all the values in the 2nd column (or row) of each array by 2 for the sample nested array below.

      (4 3)(5 3)(3 3)⍴¨⊂⍳15
┌────────┬────────┬─────┐
│ 1  2  3│ 1  2  3│1 2 3│
│ 4  5  6│ 4  5  6│4 5 6│
│ 7  8  9│ 7  8  9│7 8 9│
│10 11 12│10 11 12│     │
│        │13 14 15│     │
└────────┴────────┴─────┘

Solution

  • You can do it without using a :For control structure, but there'll still be an explicit loop in the form of the Each operator (¨):

          a ← (4 3)(5 3)(3 3)⍴¨⊂⍳15  ⍝ naming your array
          2×@2¨ a   ⍝ 2 multiplies at [row] 2 of each
    ┌────────┬────────┬───────┐
    │ 1  2  3│ 1  2  3│1  2  3│
    │ 8 10 12│ 8 10 12│8 10 12│
    │ 7  8  9│ 7  8  9│7  8  9│
    │10 11 12│10 11 12│       │
    │        │13 14 15│       │
    └────────┴────────┴───────┘
          2+@2⍤1¨ a   ⍝ 2 adds at [element] 2 row-wise of each
    ┌────────┬────────┬──────┐
    │ 1  4  3│ 1  4  3│1  4 3│
    │ 4  7  6│ 4  7  6│4  7 6│
    │ 7 10  9│ 7 10  9│7 10 9│
    │10 13 12│10 13 12│      │
    │        │13 16 15│      │
    └────────┴────────┴──────┘
    

    The @ operator work on leading axes, the leading axis of a matrix being containing the rows, so the 2nd cell is the 2nd row. The ⍤1 operator restricts the "view" of +@2 to only ever see rows, which are subarrays of rank 1..