def f_a_v3(m, n):
    return numpy.arange(m).reshape((m, 1)) * numpy.float64(numpy.arange(n))

Creating a column vector for row indices

numpy.arange(m).reshape((m, 1))

Creating a row vector for column indices

numpy.float64(numpy.arange(n))

Broadcasting and multiplication

... * ...

Returning the result

The function returns this broadcasted product immediately. If you pass m = 3 and n = 4, the returned 2D array (of shape (3, 4)) is:

[[0. 0. 0. 0.]
 [0. 1. 2. 3.]
 [0. 2. 4. 6.]]