#python
Вопрос:
Я пытаюсь понять, как работает нарезка в numpy.
A = np.array([0, 1])
B = np.array([0, 1])
B = B[:, None]
print(A[None, :] == B[:, None])
Код на python дает
[[[ True False]]
[[False True]]]
Кто-нибудь сможет помочь объяснить, почему это так?
Ответ №1:
Потому B = B[:, None]
что изменяет массив на 2d:
A = np.array([0, 1])
B = np.array([0, 1])
C = B[:, None]
print(B, C, sep='n')
Выход:
[0 1]
[[0]
[1]]
Они становятся другими.
Также:
>>> A[:, None]
array([[0],
[1]])
>>> A[None, :]
array([[0, 1]])
>>>
Это не одно и то же.
[:, None]
превращает его в форму (2, 1)
, в которую [None, :]
он превращается (1, 2)
.
Вот в чем разница: один транспонирует по столбцам, а другой-по строкам.
Также для проверки равенства это становится проверкой с A[:, None]
, с:
array([[0, 0],
[1, 1]])
И для A[None, :]
этого проверяет наличие:
array([[0, 1],
[0, 1]])
Так что первой строкой списка будет [True, False]
, потому 0 == 0
что «но 0 != 1
«. И для второго ряда это было бы [False, True]
, потому 1 != 0
что но 1 == 1
.
Ответ №2:
при записи B[:, None]
вы меняетесь B
на shape=(2,1)
, и каждый элемент помещается в одну строку, а при записи A[None, :]
вы меняетесь A
на shape=(1,2)
, и каждый элемент помещается в один столбец см.:
B = np.array([0, 1])
B = B[:, None]
#[[0]
# [1]]
A = A[None , :]
# array([[0, 1]])
затем:
[B[0][0] == A[0][0] , B[0][0] == A[0][1]]
# True , False
[B[1][0] == A[0][0] , B[1][0] == A[0][1]]
# Fale True