Как сделать так, чтобы в numpy не было ни одного синглтонного расширения? - PullRequest
0 голосов
/ 10 ноября 2019

Переход от MATLAB к NumPy, раздражает различие между 2-мерным массивом, в котором одно из измерений равно 1 - 1D.

Например:

>>>import numpy as np
>>>x1 = np.array([[1],[2],[3]])
>>>x2 = np.array([1,2,3])
>>>x1.shape
(3, 1)
>>>x2.shape
(3,)

, поэтому при использовании элементамудрый продукт Я получаю матрицу 3X3:

>>>x1 * x2
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

Но что я действительно хочу, это

>>>np.squeeze(x1) * x2
array([1, 4, 9])

Любой другой способ сделать это, кроме вызова np.squeeze() для каждого вектора?

1 Ответ

1 голос
/ 10 ноября 2019

То, что вы получаете, является результатом вещания, которое numpy реализовано задолго до MATLAB. Даже у Октавы это было до MATLAB.

У вас есть (3,1) и (3,). Ведущий размер добавляется к нижнему затемнению, производя (1,3). Вместе они передают в (3,3) и делают математику.

Если бы вы могли как-то отключить трансляцию (вы не можете), я бы ожидал ошибку несовместимых размеров.

Выхотите получить результат (3,), поэтому вам нужно каким-то образом удалить конечный размер (3,1) - squeeze, reshape или [:,0] index, чтобы сделать это.

В октаве:

>> x1 = [1;2;3];    # (3,1)
>> y1 = [1,2,3];    # (1,3)
>> x1 .* y1         # (3,3)
ans =

   1   2   3
   2   4   6
   3   6   9

Из документов Octave:

Примечание по терминологии: «широковещание» - это термин, популяризируемый числовой средой
Numpy в языке программирования Python. В других языках программирования и средах вещание также может быть известно как двоичное синглтонное расширение (BSX, в MATLAB и источник имени функции 'bsxfun'), recycling (R программирование
язык), множественные данные одной инструкции (SIMD) или репликация .

Включить предупреждение о расширениях Octave:

>> warning ("on","Octave:language-extension")
>> x1 .* y1
warning: performing `product' automatic broadcasting
ans =

   1   2   3
   2   4   6
   3   6   9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...