разница между массивами A [0] и A [0: 1] в python - PullRequest
0 голосов
/ 06 мая 2018

У меня есть такой массив:

candidates = 

array([[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
        0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
        0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1],
       [1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
        0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0]])

И я не понимаю, в чем разница между candidates[0]:

candidates[0] = 

array([1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
       0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]

candidates[0].shape = (34,)

И candidates[0:1]:

candidates[0:1] = 

array([[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
        0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]])

candidates[0:1].shape = (1, 34)

потому что я считаю, что оба должны давать одинаковые результаты? Я имею в виду, что позднее, т.е. candidates[0:1] должен представлять только первый элемент, верно? Так в чем же разница между этими двумя?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Нет. Разница в форме вашего массива. В первом случае у вас есть массив в 1 измерении. Во втором у вас есть массив в 2 измерениях.

Вы можете проверить, протестировав свойство shape ваших массивов:

print(np.array([[1, 0]]).shape)
(1, 2)

print(np.array([1, 0]).shape)
(2,)

Путем нарезки массива со списком элементов, например, [0:1], ваш результат будет иметь дополнительное измерение. Обратите внимание, что это не имеет ничего общего с использованием диапазона; это также верно, когда вы используете список с 1 элементом в качестве индексатора:

x = np.array([[0, 1], [2, 3]])

print(x[[0]].shape)
# (1, 2)
0 голосов
/ 06 мая 2018

В Python [0] - это , индексирование - это возвращает первый элемент, тогда как [0:1] - это нарезка - это возвращает коллекцию всех первых 1 элементов.

Это может быть легче увидеть с простым старым списком:

>>> lst = [1, 2, 3]
>>> lst[0]
1
>>> lst[0:1]
[1]

Numpy расширяет индексацию и нарезку в Python, и некоторые из них могут дать вам 2D-результат по разным причинам - например, вы можете индексировать с помощью [0] как «массивоподобный», который будет работать как индексный массив) , но соответствующие основы здесь одинаковы. Для двумерного пустого массива элементы являются строками, поэтому candidates[0] - это первая строка - одномерный массив, тогда как candidates[0:1] - это массив всех первых 1 строк - двумерный массив. Итак, первый имеет форму (34,), а второй имеет форму (1, 34).

Разница может быть не очевидна, если вы не присмотритесь, но сравните, как начинаются два:

array([1,
array([[1,

Они не выстроены в ряд, потому что у второго две скобки вместо одной, потому что это двумерный массив вместо 1D.

0 голосов
/ 06 мая 2018

Разница заключается в количестве измерений: candidates[0:1] вернет двумерный массив, тогда как candidates[0] вернет одномерный массив:

>>> candidates[0:1].ndim
2
>>> candidates[0].ndim
1

Вы также можете «увидеть» размерность с помощью вывода candidates[0:1]: обратите внимание на количество квадратных скобок вокруг массива? Это может быть указанием на размерность массива

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