Всегда ли 1-мерный массив numpy ведет себя как вектор строки? - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь получить хорошее представление о правилах вещания в numpy, но я заметил, что сначала мне нужно получить хорошее представление о том, что такое одномерный массив numpy. Я обнаружил несколько источников, говорящих, что одномерный массив numpy не является ни горизонтальным, ни вертикальным вектором. Исходя из этого, я ожидаю, что он ведет себя по-разному в зависимости от выполненной операции и другого компонента операции. Но я действительно не могу найти случай, когда одномерный массив будет вести себя как вектор столбца. Например:

a = np.arange(3)
b = np.arange(3)[:, np.newaxis]
a + b
array([[0, 1, 2],
      [1, 2, 3],
      [2, 3, 4]])

, что означает, что a ведет себя как горизонтальный вектор. С другой стороны, если мы добавим его к горизонтальному вектору, b:

a = np.arange(3)
b = np.arange(3)[np.newaxis, :]
a + b
array([[0, 1, 4]])

a все еще будет вести себя как горизонтальный вектор. С другой стороны, a кажется безразличным к преобразованию с .T. Итак, мой вопрос - всегда ли одномерные numpy массивы имитируют c поведение горизонтального вектора? Если нет, то в каких случаях они ведут себя как стандартный вертикальный вектор?

1 Ответ

2 голосов
/ 04 мая 2020

То, с чем вы только что столкнулись, называется свойством выравнивания по правому краю numpy массивов. Если у вас есть вектор формы (n, ) и некоторый другой массив формы (a, b, c, d, ..., z), numpy всегда будет пытаться транслировать вектор для формы (1, 1, ...., n) и, наконец, проверить, транслируется ли n с z (в другими словами, z - это кратное n).

Теперь, если вам не нужно поведение, вам придется явно сказать numpy, как вы хотите транслировать с помощью другой массив, с которым вы работаете, добавив ось к вектору, используя np.newaxis. Вы также можете использовать функцию np.broadcast_arrays для получения широковещательных массивов.

Например,

import numpy as np

a = np.array([1, 2, 3])

b = np.eye(3)

# broadcasts a to shape (1, 3) first
# adds the vector a to rows of b
# [[1, 0, 0]      [[1, 2, 3]
#  [0, 1, 0]   +   [1, 2, 3]
#  [0, 0, 1]]      [1, 2, 3]]
print(a + b)

# Tell numpy explicitly, how you want
# your vector to be broadcasted
# Now, a is first broadcasted to shape (3, 1)
# and the vector a is added to the columns of b
# [[1, 0, 0]      [[1, 1, 1]
#  [0, 1, 0]   +   [2, 2, 2]
#  [0, 0, 1]]      [3, 3, 3]]
print(b + a[np.newaxis, :])
...