Как работает индексация фрагментов в массиве numpy

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

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,)?

когда вы указываете диапазон, а не одно число, он возвращает этот диапазон как ось. Если диапазон «окажется» размером 1, это не изменит того факта, что вы запросили срез (в этом измерении), а не один элемент (который удалит измерение. Надеюсь, это ясно)

Tacratis 08.04.2019 22:52

Документация понятна. Индексирование со скаляром уменьшает размерность. Срезы не делают. Вопрос - как работает индексация списка?

hpaulj 08.04.2019 23:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
264
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

форма

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

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

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

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

форма

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

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

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(), доступную для массивов numpy. Код:

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)

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

Другие вопросы по теме