Как работает индексирование слайсов в массиве numpy - PullRequest
1 голос
/ 08 апреля 2019

Предположим, у нас есть массив

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

Теперь у меня ниже

row_r1 = a[1, :]
row_r2 = a[1:2, :]

print(row_r1.shape)
print(row_r2.shape)

Я не понимаю, почему row_r1.shape равен (4,), а row_r2.shape равен (1,4)

Разве их форма не должна быть равна (4,)?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Мне нравится думать об этом так. При первом способе row[1, :] состояния идут, чтобы получить все значения в строке 1 следующим образом:

enter image description here

Возвращение: array([5, 6, 7, 8])

форма

(4,) Четыре значения в массиве numpy.

Где в качестве второго row[1:2, :] состояния идут, чтобы получить кусочек данных между индексом 1 и индексом 2:

enter image description here

Возвращение:

array([[5, 6, 7, 8]]) Примечание: двойные скобки

форма

(1,4) Четыре значения в одном ряду в массиве np.

0 голосов
/ 09 апреля 2019

Их формы разные, потому что они не одно и то же. Вы можете проверить, напечатав их:

import numpy as np

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

row_r1 = a[1, :]
row_r2 = a[1:2, :]

print("{} is shape {}".format(row_r1, row_r1.shape))
print("{} is shape {}".format(row_r2, row_r2.shape))

Урожайность:

[5 6 7 8] is shape (4,)
[[5 6 7 8]] is shape (1, 4)

Это потому, что индексирование вернет элемент, а нарезка вернет массив. Однако вы можете манипулировать ими, чтобы они были одним и тем же, используя функцию .resize(), доступную для пустых массивов. Код:

import numpy as np

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

row_r1 = a[1, :]
row_r2 = a[1:2, :]

print("{} is shape {}".format(row_r1, row_r1.shape))
print("{} is shape {}".format(row_r2, row_r2.shape))
# Now resize row_r1 to be the same shape
row_r1.resize((1, 4))
print("{} is shape {}".format(row_r1, row_r1.shape))
print("{} is shape {}".format(row_r2, row_r2.shape))

Урожайность

[5 6 7 8] is shape (4,)
[[5 6 7 8]] is shape (1, 4)
[[5 6 7 8]] is shape (1, 4)
[[5 6 7 8]] is shape (1, 4)

Показывает, что вы на самом деле сейчас имеете дело с объектом той же формы. Надеюсь, это поможет прояснить ситуацию!

...