Как я могу вернуть главный итератор для столбцов массива?

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

Здесь не происходит никакого копирования, сглаживания или выравнивания, и используется только индексирование, и поэтому оно должно быть эффективным как с точки зрения памяти, так и с точки зрения производительности.

Другие вопросы по тегам