<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def choices(tree):
 """ Get the 'address' of each leaf node in terms of internal node choices """

    n = len(leaves(tree))
    addr = np.nan * np.ones((n, n-1))
    def _addresses(node, index, choices):
        # index is the index of the current internal node
        # choices is a list of (indice, 0/1) choices made
        if np.isscalar(node):
            for i, choice in choices:
                addr[node, i] = choice
            return index

        elif isinstance(node, tuple) and len(node) == 2:
            newindex = _addresses(node[0], index+1, choices + [(index, 0)])
            newindex = _addresses(node[1], newindex, choices + [(index, 1)])
            return newindex

        else:
            raise Exception("Not a tree!")

    _addresses(tree, 0, [])
    return addr