why np.matrix here? we normally stick with np.array