понимание фрагментов массива в Python - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над проектом машинного обучения в университете, и у меня возникают проблемы с пониманием некоторых фрагментов кода в Интернете.Вот пример:

digits = np.loadtxt(raw_data, delimiter=",")
x_train, y_train = digits[:,:-1], digits[:,-1:].squeeze() 

Что означают срезы, сделанные во второй строке?Я пытаюсь сделать срез, выбирая первые 2/3 массива, и раньше я делал что-то вроде [:2*array_elements // 3], но я не понимаю, как это сделать, если есть разделитель пополам.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Здесь задействованы два механизма.

  1. Обозначение Python для нарезки массива: Понимание обозначения среза Python

    По сути, синтаксис array[x:y], где результирующий срез начинается с x (включено) и заканчивается на y (исключено).Если start (соответственно end) опущено, это означает «от первого элемента (соответственно» до последнего элемента) (это ярлык). Также используется циклическая запись:

    array[-1:0]
    # The elements between the last index - 1 and the first (in this order).
    # Which means the elements between the last index -1 and the last index
    # Which means a list containing only the last element
    array[-1:] = [array[-1]]
    
  2. 2-мерные массивы numpy (предполагается, что np для numpy): Numpy часто использует массивы 2-х измерений, такие как матрица, поэтому для доступа к элементу в строке x и столбцеy вы можете написать это matrix[x,y] Плюс нотация питона для нарезки массивов также применяется здесь, чтобы разрезать матрицу в субматрицу меньшего размера

Итак, вернемся к вашей проблеме:

digits[:,:-1]
= digits[start:end , start:-1]
= digits[start:end , start:end-1]
= the sub-matrix where you take all the rows (start:end) and you take all the columns except the last one (start:end-1)

А

digit[:,-1:]
= digit[start:end, -1:start]
= digit[start:end, -1:end]
= sub-matrix with all the rows and only the last column
0 голосов
/ 07 декабря 2018

numpy (или что-нибудь, но это похоже на numpy) может реализовать __getitem__ для приема кортежей вместо того, что делает stdlib, где принимаются только скалярные значения (afaik) (например, целые числа, строки, объекты срезов).

Вы хотите посмотреть на «части» среза индивидуально, как указано в , разделителях.Таким образом, [:,:-1] на самом деле : и :-1, являются полностью независимыми.

Первый срез

: - это "все", без нарезки вдольэта ось.

:x все до тех пор, пока (и не включая) x и -1 означает последний элемент, поэтому ...

:-1 все до(и не включая) последний.

Второй срез

x: все после (и включая) x, и мы уже знаем о -1так что ...

-1: - это все после (и включая) последнее - в данном случае только последнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...