Как получить доступ к i-му столбцу многомерного массива NumPy?
Проблема доступа к столбцам в NumPy массиве
Я работаю с массивом NumPy, созданным следующим образом:
import numpy as np
test = np.array([[1, 2], [3, 4], [5, 6]])
При обращении к test[i]
я получаю i-ю строку (например, test[0]
возвращает [1, 2]
). Но я не знаю, как получить i-й столбец массива. Например, как получить [1, 3, 5]
для первого столбца?
Также интересует вопрос: будет ли это операция ресурсоёмкой и есть ли более эффективные способы получения столбца из массива NumPy?
Буду признателен за помощь!
5 ответ(ов)
В вашем коде использование test[:, 0]
возвращает вектор-строку (1D массив), что может вызвать проблемы при попытке объединить его с другими массивами, например, с массивом размерности 3xN, так как вы получите ошибку:
ValueError: all the input arrays must have same number of dimensions
Однако, если использовать test[:, [0]]
, это вернёт вектор-столбец (2D массив), что позволяет выполнять операции объединения (например, hstack
) без проблем.
Например:
>>> np.hstack((test, test[:, [0]]))
array([[1, 2, 1],
[3, 4, 3],
[5, 6, 5]])
Таким образом, если вы планируете объединять массивы, используйте второй способ, чтобы избежать проблем с несовпадением размерностей.
Если вы хотите получить доступ к нескольким столбцам одновременно, вы можете сделать это следующим образом:
>>> test = np.arange(9).reshape((3,3))
>>> test
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> test[:,[0,2]]
array([[0, 2],
[3, 5],
[6, 8]])
В этом примере мы создаем массив test
, а затем выбираем только первые и третьи столбцы. Использование двоеточия :
в первой части индексации позволяет получить все строки, а во второй части мы указываем нужные индексы столбцов в виде списка.
Вы также можете транспонировать массив и вернуть строку:
In [4]: test.T[0]
Out[4]: array([1, 3, 5])
Чтобы получить несколько независимых столбцов, просто выполните:
> test[:, [0, 2]]
Вы получите столбцы 0 и 2.
Чтобы выбрать 2-й по 4-й столбец массива в NumPy, вы можете использовать срезы. Вот пример, основанный на вашем массиве test
:
>>> test
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> ncol = test.shape[1] # Получаем количество столбцов
>>> ncol
5 # (Замечание: в Python 3 результат будет просто 5, без буквы "L")
Теперь вы можете выбрать 2-й по 4-й столбец следующим образом:
>>> test[0:, 1:(ncol - 1)]
array([[1, 2, 3],
[6, 7, 8]])
В данном случае 1:(ncol - 1)
означает, что мы выбираем столбцы с индексов 1 по 3 (включительно), так как индексирование начинается с нуля. Столбец с индексом 4 не включается, так как верхняя граница среза не включается.
Как вывести полный массив NumPy без обрезки?
Как получить последний элемент списка?
Как найти индекс элемента в списке?
Как удалить элемент из списка по индексу
Выбор нескольких колонок в DataFrame Pandas