How much of the np.vectorize docs did you read?
In [129]: def f(x):
...: print(x)
...:
...: x = np.array([[ 0.31432202, 7.94263361],
...: [-0.5346868, 1.93901039],
...: [-0.47571535, 4.17720033]])
In [130]: f1=np.vectorize(f)
In [131]: f1(1)
1
1
Out[131]: array(None, dtype=object)
f gets called twice, once to determine the return dtype, and once for each element. Try it with 3 elements:
In [132]: f1([1,2,3])
1
1
2
3
Out[132]: array([None, None, None], dtype=object)
Note that the return is an array with None. That's because your f doesn't have a return statement. It just does the print.
Why are you using np.vectorize? It has a clear performance disclaimer. It also talks about the return dtype and how it determines that. It's not a high performance way of calling a function that just prints something. It may be useful for running a function of several scalar values, and you want to take advantage of numpy broadcasting.
Read the docs.