Предположим, у меня есть:
test = numpy.array([[1, 2], [3, 4], [5, 6]])
test[i]
возвращает мне i-ю строку массива (например [1, 2]
). Как я могу получить доступ к i-му столбцу? (например [1, 3, 5]
). Кроме того, это будет дорогая операция?
>>> test[:,0]
array([1, 3, 5])
По аналогии,
>>> test[1,:]
array([3, 4])
позволяет вам получить доступ к строкам. Это описано в Разделе 1.4 (Индексирование) ссылки NumPy . Это быстро, по крайней мере, по моему опыту. Это, конечно, намного быстрее, чем доступ к каждому элементу в цикле.
И если вы хотите получить доступ к нескольким столбцам одновременно, вы можете сделать:
источник
test[:,[0,2]]
просто получает доступ к данным, например,test[:, [0,2]] = something
изменяет тест, а не создает другой массив. Ноcopy_test = test[:, [0,2]]
на самом деле создает копию, как вы говорите.test[:,[0,2]]
просто получить доступ к данным, аtest[:, [0, 2]][:, [0, 1]]
нет? Кажется очень не интуитивным, что повторение того же самого имеет другой результат.эта команда дает вам вектор строки, если вы просто хотите зациклить его, это нормально, но если вы хотите выполнить hstack с другим массивом с размером 3xN, у вас будет
пока
дает вам вектор-столбец, так что вы можете выполнять конкатенацию или операцию hstack.
например
источник
Вы также можете транспонировать и возвращать строку:
источник
Чтобы получить несколько независимых столбцов, просто:
вы получите столбцы 0 и 2
источник
Хотя на вопрос дан ответ, позвольте мне упомянуть некоторые нюансы.
Допустим, вы заинтересованы в первом столбце массива
Как вы уже знаете из других ответов, чтобы получить его в виде «вектора строки» (массива формы
(3,)
), вы используете нарезку:Чтобы проверить, является ли массив представлением или копией другого массива, вы можете сделать следующее:
см. ndarray.base .
Помимо очевидного различия между ними (изменение
arr_c1_ref
повлияетarr
), количество байтовых шагов для прохождения каждого из них различно:видеть успехи . Почему это важно? Представьте, что у вас есть очень большой массив
A
вместоarr
:и вы хотите вычислить сумму всех элементов первого столбца, т.е.
A_c1_ref.sum()
A_c1_copy.sum()
. или . Использование скопированной версии намного быстрее:Это связано с разным количеством шагов, упомянутых ранее:
Хотя может показаться, что лучше использовать копии столбцов, это не всегда верно по той причине, что создание копии занимает много времени и требует больше памяти (в этом случае мне понадобилось около 200 мкс для создания
A_c1_copy
). Однако, если нам нужна копия в первую очередь, или нам нужно выполнить много разных операций с определенным столбцом массива, и мы в порядке с потерей памяти ради скорости, то создание копии - это путь.В случае, если мы заинтересованы работать в основном со столбцами, было бы неплохо создать наш массив в мажорном столбце ('F'), а не в мажорном ряду ('C') (по умолчанию ), а затем выполните нарезку, как раньше, чтобы получить столбец, не копируя его:
Теперь выполнение операции суммирования (или любой другой) в представлении столбцов выполняется намного быстрее.
Наконец, позвольте мне заметить, что транспонирование массива и использование нарезки строк - это то же самое, что и нарезка столбцов в исходном массиве, потому что транспонирование выполняется просто путем замены формы и шагов исходного массива.
источник
Затем вы можете выбрать 2-4 столбец следующим образом:
источник