Вот несколько вариантов, от самых медленных до самых быстрых.
>>> import operator as op
>>> import itertools as it
>>>
>>> np.rec.fromrecords(matrix)['f0']
array([[1, 2],
[5, 6]])
>>> timeit(lambda:np.rec.fromrecords(matrix)['f0'], number=100_000)
5.490952266845852
>>>
>>> np.vectorize(op.itemgetter(0), otypes=(int,))(matrix)
array([[1, 3],
[5, 7]])
>>> timeit(lambda:np.vectorize(op.itemgetter(0), otypes=(int,))(matrix), number=100_000)
1.1551978620700538
>>>
>>> np.stack(matrix.ravel())[:,0].reshape(matrix.shape)
array([[1, 3],
[5, 7]])
>>> timeit(lambda: np.stack(matrix.ravel())[:,0].reshape(matrix.shape), number=100_000)
0.9197127181105316
>>>
>>> np.reshape(next(zip(*matrix.reshape(-1))), matrix.shape)
array([[1, 3],
[5, 7]])
>>> timeit(lambda:np.reshape(next(zip(*matrix.reshape(-1))), matrix.shape), number=100_000)
0.7601758309174329
>>>
>>> np.fromiter(it.chain.from_iterable(matrix.reshape(-1)), int)[::2].reshape(matrix.shape)
array([[1, 3],
[5, 7]])
>>> timeit(lambda:np.fromiter(it.chain.from_iterable(matrix.reshape(-1)), int)[::2].reshape(matrix.shape), number=100_000)
0.5561180629301816
>>>
>>> np.frompyfunc(op.itemgetter(0), 1, 1)(matrix).astype(int)array([[1, 3],
[5, 7]])
>>> timeit(lambda:np.frompyfunc(op.itemgetter(0), 1, 1)(matrix).astype(int), number=100_000)
0.2731688329949975
>>>
>>> np.array(matrix.tolist())[...,0]
array([[1, 3],
[5, 7]])
>>> timeit(lambda:np.array(matrix.tolist())[...,0], number=100_000)
0.249452771153301
Вы можете получить другой порядок рангов для других проблемных размеров или платформ.