Каковы различия между массивом [0] и массивом [0: 1] в Python? - PullRequest
1 голос
/ 08 мая 2019

Мой вопрос может показаться слишком простым, но мне любопытно узнать, почему это доступно в Python.

Предположим, мы определили массив размером (4,3):

import numpy as np
a=np.random.randint(15,size=(4,3))

Результат будет примерно таким:

array([[ 7,  6,  1],
       [ 5,  3,  6],
       [12, 10, 11],
       [ 1,  3,  4]])

В чем разница между:

a[0]

Result:
array([7, 6, 1])

и

a[0:1]

Result:
array([[7, 6, 1]])

Поскольку оба они возвращаютта же часть матрицы:

7, 6, 1

Я знаю, что разница в форме, так как первая форма (3,), а последняя имеет размер (1,3).Но мой вопрос заключается в том, почему нам нужны такие формы.Если вы знакомы с Matlab, предоставление диапазона с использованием двоеточия дает вам две строки, но в Python он возвращает ту же информацию с различной формой.Какой смысл?в чем преимущество?

Ответы [ 5 ]

2 голосов
/ 08 мая 2019

Причина в том, что вы можете быть уверены, что array [x: y] всегда возвращает подмассив исходного массива. Так что вы можете использовать все методы массива на нем. Скажем, у вас есть

map(lambda1, array[x:y])

Даже если y-x == 1 или y-x == 0, вы гарантированно получите массив, возвращенный из array[x:y], и вы можете сделать карту поверх него. Представьте, что вместо array[1:2] возвращен один элемент, т.е. array[1]. Тогда поведение приведенного выше кода зависит от того, что представляет собой массив [1], и, вероятно, это не то, что вам нужно.

0 голосов
/ 08 мая 2019

Обозначение двоеточия является сокращением для нарезки, поэтому начните с краткого определения терминов с нескольких тривиальных примеров.Я бы посоветовал вам этот замечательный ответ , чтобы начать с понимания того, как срезы работают в целом.Это контрастирует с тем, что я буду называть «нотацией доступа» или доступом к элементу массива, например a[0].

. Следовательно, в вашем случае разница в том, что ваш n-мерный массив может быть доступ в измерении 0, который возвращает серию столбцов в этой строке.Напротив, нарезка вашего n-мерного массива от 0 до 1 дает список, содержащий измерения от 0 до 1, но не включая 1, который будет двумерным массивом, в котором первый (и единственный) элементэто серия столбцов в первой строке.

Относительно форм, это зависит от того, что вы делаете с данными.Например, если вам необходимо получить доступ к нескольким строкам одновременно, возможно, имеет смысл использовать более широкий срез за один проход, тогда как для записи доступа потребуется несколько операторов или цикл.

Примечание оВ частности, Numpy Arrays

Нарезка традиционного одномерного массива всегда приведет к подмножеству исходного массива в качестве копии .Напротив, нарезка n-мерного массива NP даст представление , которое разделяет память с исходным массивом.Будьте осторожны, так как изменение этого фрагмента также изменит оригинал!

0 голосов
/ 08 мая 2019

Я попытаюсь объяснить на упрощенном примере.

simple_matrix = [[0,1,2],[3,4,5],[6,7,8]]

Следующий код печатает один элемент из этого списка списков:

print (simple_matrix[0])

Напечатанный элемент являетсясписок, это потому, что элемент с индексом 0 для simple_matrix only a list:

>>> [0,1,2]

Использование среза, как в следующем примере, возвращает not один элемент, но два .В этом случае проще ожидать, что список элементов будет возвращен, и это именно то, что мы видим как результат:

print (simple_matrix[0:2])
>>> [[0, 1, 2], [3, 4, 5]]

Что вас озадачивает, так это вывод:

print simple_matrix[0:1]
>>> [[0, 1, 2]]

Вы получаете этот вывод, потому что в этом случае вы получаете не один элемент из списка, как мы это делали в первом примере, а потому что вы нарезаете список списков.

Этот срез возвращает список, содержащий нарезанныйэлементы, в данном случае только список [0, 1, 2].

0 голосов
/ 08 мая 2019

array[m:n] возвращает массив, array[0] возвращает элемент массива (это также имеет отношение к NumPy, я обещаю, просто читайте дальше):

> py -3
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> array = [1,2,3]
>>> array[0]
1
>>> array[0:1]
[1]
>>>

Вот почему вы получаетеэти результаты:

a[0]

Результат:

array([7, 6, 1])

и

a[0:1]

Результат:

array([[7, 6, 1]])

Если вы посмотрите внимательно, вторая возвращает array, который оборачивает список списка чисел , а первая возвращает array, которая оборачивает список номеров.

0 голосов
/ 08 мая 2019

Я полагаю, что вас смущает то, что в python, когда вы берете соединение массива, оно включает начальный индекс, но ИСКЛЮЧИТЕЛЬНО конечного индекса . Я считаю, что в Matlab и начальный индекс, и конечный индекс являются инклюзивными.

Итак, для примера, который вы привели: a[0:1] примет индекс 0, а не 1.

Однако, если вы используете a[0:2], вы получите то, что находится на индексах 0 и 1, и получите результат, который вы ожидали.

Это также объясняет, почему форма отличается, [0: 1] делает именно то, что вы ожидаете. Он дает вам список строк, но этот список содержит только 1 строку, следовательно, 1 в форме (1, 3). И наоборот, [0] дает вам только одну строку, а не список строк. Строка имеет 3 элемента, и, следовательно, вы получите форму (3,)

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