Lots of answers! And here's another, based on numpy.indices:
In [1458]: low = -50
In [1459]: high = 51
In [1460]: ndim = 2
In [1461]: coords = (np.indices((high-low,)*ndim) + low)[::-1].reshape(ndim, -1).T
In [1462]: coords
Out[1462]:
array([[-50, -50],
[-49, -50],
[-48, -50],
...,
[ 48, 50],
[ 49, 50],
[ 50, 50]])
If it is not essential that the first coordinate varies the fastest, the reordering achieved by [::-1] can be removed:
In [1463]: coords = (np.indices((high-low,)*ndim) + low).reshape(ndim, -1).T
In [1464]: coords
Out[1464]:
array([[-50, -50],
[-50, -49],
[-50, -48],
...,
[ 50, 48],
[ 50, 49],
[ 50, 50]])
The use of ndim provides a gratuitous feature; it allows for generating a similar array in higher dimensions:
In [1465]: ndim = 3
In [1466]: coords = (np.indices((high-low,)*ndim) + low)[::-1].reshape(ndim, -1).T
In [1467]: coords
Out[1467]:
array([[-50, -50, -50],
[-49, -50, -50],
[-48, -50, -50],
...,
[ 48, 50, 50],
[ 49, 50, 50],
[ 50, 50, 50]])