Каково точное значение вопросительных знаков в einsum-подобной подписи gufun c? - PullRequest
1 голос
/ 09 апреля 2020

Например:

np.arange(3)@np.arange(2)
# Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
# ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)

Обратите внимание: я знаю, что не так и что означает сообщение об ошибке. Мне просто интересен точный синтаксис. Что означают знаки вопроса?

1 Ответ

1 голос
/ 09 апреля 2020

Они указывают размеры, которые могут отсутствовать. Если такой размер отсутствует, он будет обрабатываться так, как если бы он присутствовал с длиной 1, но соответствующий размер будет удален из выходных данных.

В сигнатуре matmul (n?,k),(k,m?)->(n?,m?), первом измерении Первый аргумент и второе измерение второго аргумента могут быть пропущены. Если это так, первый аргумент будет обрабатываться как вектор строки, а второй аргумент будет рассматриваться как вектор столбца.

Цитирование NEP 20 - Расширение сигнатур обобщенных универсальных функций ,

Возможно, отсутствуют размеры. Эта часть почти полностью управляется wi sh, чтобы обернуть matmul в гуфун c. matmul обозначает умножение матриц, и, если бы он делал только это, он мог бы быть покрыт подписью (m,n),(n,p)->(m,p). Тем не менее, он имеет особые случаи, когда измерение отсутствует, что позволяет обрабатывать любой аргумент как один вектор, при этом функция, таким образом, становится умножением на вектор-матрицу, матрицу-вектор или вектор-вектор (но без трансляции ). Чтобы поддержать это, предлагается разрешить постфиксировать имя измерения со знаком вопроса, чтобы указать, что измерение не обязательно должно присутствовать.

При таком добавлении подпись для matmul может быть выражена как (m?,n),(n,p?)->(m?,p?). Это указывает на то, что если, например, второй операнд имеет только одно измерение, для целей элементарной функции он будет обрабатываться так, как будто этот вход имеет форму ядра (n, 1), а выход имеет соответствующую форму ядра (m, 1). Однако у действительного выходного массива удален гибкий размер, т. Е. Он будет иметь форму (..., m). Аналогично, если оба аргумента имеют только одно измерение, входные данные будут представлены в виде элементарных функций (1, n) и (n, 1), а выходные данные - (1, 1), в то время как реальный возвращенный массив будет иметь форму * 1025. *. Таким образом, подпись позволяет использовать одну элементарную функцию для четырех связанных, но разных подписей, (m,n),(n,p)->(m,p), (n),(n,p)->(p), (m,n),(n)->(m) и (n),(n)->().

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