У меня есть массив вроде:
a = array([[1,2,3],[3,4,5],[4,5,6]])
какой наиболее эффективный способ вырезать массив 1x2 из этого, который имеет только первые два столбца "a"?
т.е.
array([[2,3],[4,5],[5,6]]) in this case.
спасибо.
У меня есть массив вроде:
a = array([[1,2,3],[3,4,5],[4,5,6]])
какой наиболее эффективный способ вырезать массив 1x2 из этого, который имеет только первые два столбца "a"?
т.е.
array([[2,3],[4,5],[5,6]]) in this case.
спасибо.
Двумерные массивы numpy индексируются с использованием a[i,j]
(not a[i][j]
), но вы можете использовать одну и ту же нотацию для среза с массивами numpy и матрицами, как это можно сделать с обычными матрицами в python (просто поместите их в один []
):
>>> from numpy import array >>> a = array([[1,2,3],[3,4,5],[4,5,6]]) >>> a[:,1:] array([[2, 3], [4, 5], [5, 6]])
Это то, что вы ищете?
a[:,1:]
Или, другими словами (процитировать документация) Синтаксис основного среза: i: j: k, где я - начальный индекс, j - индекс остановки, k - шаг (k > 0)
Теперь, если 'i' не задано, оно по умолчанию равно 0 для k > 0 и n - 1 для k < 0. Если j не задано, значение по умолчанию равно n.
То для одномерного массива. Теперь двухмерные массивы - это другой зверь. Синтаксис среза - это [rowrange, columnrange]
Итак, если вы хотите все строки, но только два последних столбца, как в вашем случае, вы делаете а [0: 3,1: 3].
Здесь [0: 3] означает, что все строки от 0 до 3. и [1: 3] означает все столбцы от столбца 1 до столбца 3.
Теперь, как вы можете подумать, хотя у вас есть только 3 столбца, и нумерация начинается с 1, так что технически эта команда должна возвращать 3 столбца вправо. i.e столбец 1, столбец2, столбец 3. Это сложная часть этого синтаксиса. Вы должны начать отсчет от ПОСЛЕ первого номера. Поэтому, когда вы говорите [1: 3], вы на самом деле говорите, что дайте мне столбец 2 и столбец 3. Каковы последние два столбца, которые вы хотите.
Теперь, если вы не знаете, как долго ваша матрица или вам нужны все строки, вы можете просто оставить эту часть пустой. то есть
a [:, 1: 3] также будет работать.
То же самое касается и столбцов. Если вы хотите сказать, что все столбцы, но только первая строка, вы должны написать
а [0: 1,:]
Теперь, как работает вышеупомянутый ответ [:, 1:], потому что, когда вы говорите [1:] для столбцов, это означает дать мне что-нибудь ПОСЛЕ первого столбца и до конца всех столбцов. т.е. пустое означает "до конца".
Теперь вы должны понимать, что что-либо по обе стороны от запятой - это все подмножество одномерного случая, о котором я упоминал выше. Если вы хотите указать свои строки, используя размеры шага, вы можете написать а [:: 2,1]
Что в вашем случае вернет массив ([[2, 3], [5, 6]])
В команде выясняется, что: дайте мне все строки, взяв по 2 за раз. Плюс дайте мне только последние 2 столбца.
Мне понадобилось время, чтобы разобраться. Таким образом, вставляя его здесь, на всякий случай это помогает кому-то.