Я читал о нарезке python, но я не смог понять это.
clf.predict_proba(X_test)[:,1]
Затем я попытался проверить себя с помощью простого списка.
a = [2,4,6,7,7,8]
>>> a[:,1]
-----> TypeError: list indices must be integers or slices, not tuple
Можете ли вы объяснить мне, что происходит в деталях?
Посмотрите на это: stackoverflow.com/questions/33491703/meaning-of-x-x-1-in-python/…
Отвечает ли это на ваш вопрос? Значение X = X[:, 1] в Python
Это то же самое, что и array[x,y]
, где x == slice(None)
и y == 1
Существует большая разница при работе с массивами numpy, как результат clf.predict_proba(X_test)[:,1]
и list
:
Как уже упоминалось в комментариях, списки могут быть разделены одиночными значениями, а не разделены запятыми из-за их структуры, тогда как массив numpy может быть n-мерным, может быть разделен внутри со значением, разделенным запятой, чтобы указать количество строк и столбцы, как это делает pd.DataFrame.iloc[].
np.array([1,1],[2,3],[4,3])
ex_list = [[1,1],[2,3],[4,3]]
Но как это выглядит на самом деле? Что ж, в случае списков они одномерные или flat
, а этот массив — нет.
1 arr_example
Имеет 3 строки и 2 столбца:
array([[1, 1],
[2, 3],
[4, 3]])
2 ex_list
:
[[1,1],[2,3],[4,3]]
Если вы хотите получить доступ к внутреннему значению вложенного списка, то индексирование должно выполняться за пределами первого слайсера, как вы можете видеть в примере ниже:
arr_example[:1,0] # arr_example[rows,columns]
list_example[:1][0][0]
В этом случае в arr_example
мы выбираем строки от начала до, но не включая 1 (позиция 1, поэтому только первая строка) и первый столбец (позиция 0). Глядя на структуру данных и понимая, как работает нарезка, можно сделать следующие выводы:
array([1])
1
Итак, вы говорите, если я вас понял, что n-мерная нарезка массива numpy и нарезка кадра данных pandas с использованием loc и iloc выполняются одинаково [:,1]
Таким образом, вы указываете, что первое значение указывает количество строк, а второе - количество столбцов, да. Я добавил полное объяснение.
Хай! @martin a[:,1:]
используется, например, для нарезки двумерного массива NumPy.
a = [[1,2,3,4,5], [6,5,3,2,6]]
представлять как
a = [[1, [ 6,
2, 5,
3, 3,
4, 2,
5 6
], ]]
чем a[:,1]
== a[col[start] : col[end], row[start] : row[end]]
будет [[2,5]]
означает взять столбец и строку в 1-м индексе.
Осторожно, @martian_rover! Определение, которое вы используете, - это не массив numpy, а вложенный список. Использование нарезки, которую вы предоставили в своем примере, вернет IndexError
x[:,1]
переводится переводчиком на
x.__getitem__((slice(None), 1))
То есть он вызывает метод __getitem__
объекта x
, передавая ему (в данном случае) аргумент кортежа. :
переводится в slice
объект. Это запятая в индексации, которая создает кортеж.
Если x
представляет собой пустой массив, индексация с помощью кортежа имеет смысл (в соответствии с собственными правилами). Но, как указывает ваша ошибка, индексация с помощью tuple
не работает для списка. Ошибка говорит, что разрешено.
Таким образом, хотя синтаксис python в целом допускает такое индексирование, детали зависят от класса.
Для двумерного массива [:,1]
означает выбор второго столбца.
Этот синтаксис предназначен для нарезки многомерного массива numpy.