Как я могу вернуть главный итератор для столбцов массива?
ndarray
объекты в numpy
иметь flat
собственность (например, array.flat
), что позволяет перебирать его элементы. Например:
>>> x = np.arange(1, 7).reshape(2, 3)
>>> x
array([[1, 2, 3],
[4, 5, 6]])
>>> x.flat[3]
4
Но как я могу вернуть столбец 1D итератор, так что приведенный выше пример возвращает 5
вместо 4
?
2 ответа
Не уверен, что это лучший способ, но кажется, что просто
array.T.flat
даст результат, который я ищу. Хотя хотелось бы, чтобы был какой-то подходящий метод, который я мог бы указать order='F'
, что было бы проще понять с первого взгляда.
Подход № 1
Ты можешь использовать .ravel('F')
иметь основной порядок столбцов, а затем индексировать -
x.ravel('F')[3]
Пробный прогон -
In [100]: x
Out[100]:
array([[1, 2, 3],
[4, 5, 6]])
In [101]: x.ravel('F')[3]
Out[101]: 5
Это создаст копию всего массива перед выбором элементов -
In [161]: np.may_share_memory(x, x.ravel())
Out[161]: True
In [162]: np.may_share_memory(x, x.ravel('F'))
Out[162]: False
Таким образом, это может быть не самым эффективным для памяти. Для лучшего давайте перейдем к другому подходу.
Подход № 2
Мы можем получить индексы строк и столбцов из упорядоченного индекса по главному столбцу, а затем просто индексировать его в массив -
x[np.unravel_index(3, np.array(x.shape)[::-1])]
Пробный прогон -
In [147]: x
Out[147]:
array([[1, 2, 3],
[4, 5, 6]])
In [148]: idx = np.unravel_index(3, np.array(x.shape)[::-1])
In [149]: idx
Out[149]: (1, 1) # row, col indices obtained in C order
In [150]: x[idx]
Out[150]: 5
Здесь не происходит никакого копирования, сглаживания или выравнивания, и используется только индексирование, и поэтому оно должно быть эффективным как с точки зрения памяти, так и с точки зрения производительности.