numpy .dot умножение матрицы функций: Numpy умножает матрицу AxB и матрицу 1xB на матрицу AxB и матрицу Bx1 - PullRequest
0 голосов
/ 30 апреля 2020

В приведенном ниже коде я должен умножить матрицу 5x3 на вектор. Мне вектор кажется матрицей 1x3, однако python видит его как матрицу 3x1.

Почему w в коде ниже матрицы 3x1 или почему python делает ее матрицей 3x1?

Заранее спасибо.

import numpy

X = numpy.array([[4.6, 3.4, 1.4],
    [6.5, 3.2, 5.1],
    [5.7, 2.9, 4.2],
    [6.6, 3.,  4.4],
    [6.,  2.9, 4.5]])

print(X)
print(X.shape)
print("")

wb0 = numpy.array([0.0, 1.0, 1.0, 1.0])
print(wb0)
print("shape wb0",wb0.shape)

print()

w = wb0[1:]
print(w)
print("shape w",w.shape)

print("")
print(numpy.dot(X,w)) 

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Не путайте значение измерения, используемого в математике, с измерением в numpy.
Ваша первая матрица имеет форму (5,3), это правильно. И он имеет размерность 2.
Второй вектор не является матрицей 3x1 для numpy. Он имеет форму (3,) и размерность 1:

wb0 = np.array([ 1.0, 1.0, 1.0])

Эквивалентная матрица 3x1 для numpy будет выглядеть следующим образом:

wb1 = numpy.array([[1.0], [1.0], [1.0]])
print(wb1)
print("shape wb1",wb1.shape)

Как вы можете видеть Здесь у нас есть два измерения для wb1 по сравнению с wb0. Хотя wb0 выглядит как матрица 3x1, для numpy это матрица (3,).
Матрица 1x3 wb01 будет выглядеть следующим образом:

wb2 = numpy.array([[1.0, 1.0, 1.0]])
print(wb2)
print("shape wb0",wb2.shape)

Таким образом, размерность и формы в numpy отличаются от размерности, используемой для матрицы в общей алгебре. Очень подробное объяснение можно найти в следующей ветке: Разница между numpy .изображением массива (R, 1) и (R,)

В вашем случае причина в том, что numpy может сделать умножение матриц между матрицей (5,3) и матрицей (3,) реализацией функции dot :

Если a массив ND, а b - это одномерный массив, это сумма произведений по последней оси a и b.

Вы бы получили тот же результат, если бы использовали функцию точки для (5 , 3) матрица и (3,1) матрица:

import numpy

X = numpy.array([[4.6, 3.4, 1.4],
    [6.5, 3.2, 5.1],
    [5.7, 2.9, 4.2],
    [6.6, 3.,  4.4],
    [6.,  2.9, 4.5]])

print(X)
print(X.shape)
print("")

wb0 = numpy.array([0.0, 1.0, 1.0, 1.0])
print(wb0)
print("shape wb0",wb0.shape)

print()

w = numpy.array([[1.0], [1.0], [1.0]])
print(w)
print("shape w",w.shape)

print("")
print(numpy.dot(X,w)) 

Единственное отличие состоит в том, что в вашем случае конечный результат имеет форму (5,), а во втором случае результат будет иметь форма (5,1).

0 голосов
/ 30 апреля 2020

расчет в numpy .dot () сильно зависит от ваших входных переменных. Строка do c дает:

точка (a, b, out = None)

[...]

  • Если a - это массив ND, а b - это одномерный массив, это сумма произведений по последней оси a и b.
  • Если оба a и b являются двумерными массивами, это матричное умножение, но использование: fun c: matmul или a @ b является предпочтительным.

[...]

Если вы хотите использовать матричное умножение, вы должны определить w как двумерный массив:

wb0 = numpy.array([[0.0, 1.0, 1.0, 1.0]])
w = wb0[0,1:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...