Предположим, у нас есть массив
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,)?
Документация понятна. Индексирование со скаляром уменьшает размерность. Срезы не делают. Вопрос - как работает индексация списка?
Мне нравится думать об этом таким образом. Первый способ 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)
Показывая, что вы на самом деле сейчас имеете дело с объектом той же формы. Надеюсь, это поможет прояснить ситуацию!
когда вы указываете диапазон, а не одно число, он возвращает этот диапазон как ось. Если диапазон «окажется» размером 1, это не изменит того факта, что вы запросили срез (в этом измерении), а не один элемент (который удалит измерение. Надеюсь, это ясно)