Разница между этими формами массива в numpy

В чем разница между двумя массивами, чьи формы -

(442,1) и (442,)?

Печать обоих из них дает идентичный вывод, но когда я проверяю равенство ==, я получаю 2D-вектор, подобный этому -

array([[ True, False, False, ..., False, False, False],
       [False,  True, False, ..., False, False, False],
       [False, False,  True, ..., False, False, False],
       ..., 
       [False, False, False, ...,  True, False, False],
       [False, False, False, ..., False,  True, False],
       [False, False, False, ..., False, False,  True]], dtype=bool)

Может кто-нибудь объяснить разницу?

Ответы

Ответ 1

Массив формы (442, 1) является двумерным. Он имеет 442 строки и 1 столбец.

Массив формы (442, ) является одномерным и состоит из 442 элементов.

Обратите внимание, что их представления должны выглядеть иначе. Существует разница в количестве и размещении скобок:

In [7]: np.array([1,2,3]).shape
Out[7]: (3,)

In [8]: np.array([[1],[2],[3]]).shape
Out[8]: (3, 1)

Обратите внимание, что вы можете использовать np.squeeze для удаления осей длиной 1:

In [13]: np.squeeze(np.array([[1],[2],[3]])).shape
Out[13]: (3,)

Правила вещания NumPy позволяют автоматически добавлять новые оси слева, когда это необходимо. Поэтому (442,) может транслироваться до (1, 442). И оси длины 1 могут транслироваться на любую длину. Так когда вы проверяете равенство между массивом формы (442, 1) и массивом формы (442, ), второй массив получает форму (1, 442), а затем два массива расширяют свои оси длиной 1, так что они оба становятся широковещательными массивами формы (442, 442). Вот почему, когда вы проверяли на равенство, результатом был логический массив формы (442, 442).

In [15]: np.array([1,2,3]) == np.array([[1],[2],[3]])
Out[15]: 
array([[ True, False, False],
       [False,  True, False],
       [False, False,  True]], dtype=bool)

In [16]: np.array([1,2,3]) == np.squeeze(np.array([[1],[2],[3]]))
Out[16]: array([ True,  True,  True], dtype=bool)