Skip to content

Shape Reshape

Array basics

  1. Expermient with the expressions in the following block to gain an understanding of the functions used.
  2. Write a brief definition in English for each expression.
    For example: {2×⍳⍵} ⍝ Even integers from 2 to 2×⍵ inclusive.
  3. Use the language bar to discover the names of unfamiliar functions.
      3 4⍴⍳12   ⍝ A 3 row, 4 column matrix of the integers from 1 to 12 inclusive      
      ⍴cards←'A23456789TJQK'∘.,'SCHD'
      ⍉cards
      (,cards)[?×/⍴cards]
      alph←2 3 4⍴⎕A
      ,alph      

The shape of a scalar

Use the match function ⍺≡⍵ to determine which expressions below produce the empty character vector '' ("quote-quote") and which produce the empty numeric vector ("zilde").

      0⍴0
      0↑⎕A
      ⍳0
      0⍴''
      0⍴'def'
      0 0⍴'abc'
      2 0 3⍴⍳6
      alph[⍸alph='Z']
      ⌈⌿⍬⍬
      ⎕JSON'{}'
      ⎕JSON'[]'
      ⎕JSON'""'

A simple array contains only single numbers and/or characters as elements. Single numbers or characters are called scalars. Arrays generally can contain any other array. These are called nested arrays. For example cards is a nested matrix of character vectors.

      ⍴¨1 2 3 4   ⍝ What is the shape of each number in ⍳4?
      ⍴¨'ABCDE'   ⍝ What is the shape of each letter in 5↑⎕A?
      ⍴¨cards     ⍝ What is the shape of each array in cards?

Problem set 5

    1. Write a function IsEmpty to determine if an array has an empty axis.

            IsEmpty 2 0 3⍴⍳4
      1

            IsEmpty 2 2 3⍴⍳4
      0

            IsEmpty 0
      0

            IsEmpty 0⍴0
      1

    2. Any simple array can be described using two vectors. Which two primitive functions (that is, functions represented by symbols) return these vectors when given a simple array argument?

    3. The rank of an array is the number of axes or dimensions an array has. If the shape of an array is given by the vector result of the shape function ⍴⍵, give an expression for the rank of an array.

    Answers

    1. IsEmpty←{0∊⍴⍵}
    2. The functions shape ⍴⍵ and ravel ,⍵ return these two vectors, which are called the shape and the ravel of elements.
    3. Traditionally, the rank is defined as the shape of the shape ⍴⍴⍵. However, in modern APL it is preferable to use the tally of the shape ≢⍴⍵.

  1. Some Points in Space

    The positions of 5 points in 3D space are given by the matrix pos:

    pos←5 3⍴0 1 3 4 2

    1. Write a function AddRows to add a vector to a matrix.

            1 ¯3 4 AddRows pos
      1 ¯2 7
      5 ¯1 4
      2  0 8
      3 ¯3 5
      4  1 6

    2. Write a function NormRows to normalise each vector in pos so that the sum of squares of each vector is 1.

            +/pos*2
      10 20 26 5 29

            +/(NormRows pos)*2
      1 1 1 1 1

            ÷/2-/pos
      0.5 1 2 ¯2 ¯0.5

            ÷/2-/NormRows pos   ⍝ Relative proportions stay the same
      0.5 1 2 ¯2 ¯0.5

      Hint

      The replicate / and reshape functions might be useful.

    Bonus

    Write commutative versions of AddRows which will still work when the vector and matrix arguments are swapped.

    Answers

    1. This solutions assumes a vector left argument:
      AddRows ← {⍵+(⍴⍵)⍴⍺}
    2. Using only things which have been introduced so far:
      NormRows ← {⍵÷(⍴⍵)⍴(⍴⍵)[2]/0.5*⍨+/⍵*2}

    Bonus Answers

    A commutative version of AddRows can be made by sorting using the ranks, and is expressed most clearly as two expressions separated by the statement separator

    AddRows ← {(v m)←⍺ ⍵[(≢⍴)¨⍺ ⍵] ⋄ m+(⍴m)⍴v}   ⍝ v is the vector, m is the matrix
    It can be coded in a single expression as a reduction, but then the result must be disclosed using pick , which we will cover later in the course. If you want to know why, look at the shape of the result with and without the pick
    AddRows ← {⊃{⍵+(⍴⍵)⍴⍺}/⍺ ⍵[(≢⍴)¨⍺ ⍵]}
    In the next section, we will see a better way to write functions that work on arrays of differing rank.

  2. Without executing them, determine the shape of the results of the following expressions:

          1 3 5∘.!2 4 6 8
          1 2 3 + 4 5 6
          {(+⌿⍵)÷≢⍵}3 1 4 1 5
          +⌿2 3⍴⍳6
          ?⌿2 3⍴3/4 52
          ⌈/(2 3⍴⍳6)∘.ׯ1+?5 4⍴0

    Hint

    Of course, you can always check your answers using the shape function

    Answers

      3 4 ≡ ⍴1 3 5∘.!2 4 6 8
        3 = ⍴1 2 3 + 4 5 6
        ⍬ ≡ ⍴{(+⌿⍵)÷≢⍵}3 1 4 1 5   ⍝ The empty numeric vector
        3 = ⍴+⌿2 3⍴⍳6
        3 = ⍴?⌿2 3⍴3/4 52
    2 3 5 ≡ ⍴⌈/(2 3⍴⍳6)∘.ׯ1+?5 4⍴0