Нарезка массива Numpy с использованием None и двоеточия:

#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