Матричное умножение NxM в Python - PullRequest
1 голос
/ 03 мая 2020

У меня есть 2 матрицы в Python: матрица A формы (4,1) и матрица B формы (4,4). Я сформировал 2 матрицы, используя данные в списке.

Данные valList выглядят как

00200030
00200030
00200030
00200030
00480051
FFF0004B
FFF0004B

. Я преобразовал каждый элемент в 32-разрядное целое число, а затем использовал данные для формирования матриц.

for item in valList:
    int(item,32)

B_RC = createMatrix(rows,1,valList)
B = np.array(B_RC)
print B

A_RC = valList[rows:rows + (rows * cols)]
A = np.array(A_RC).reshape( (rows,cols))
print A

def createMatrix(rowCount, colCount, dataList):   
    mat = []
    for i in range (rowCount):
        rowList = []
        for j in range (colCount):
            if dataList[j] not in mat:
                rowList.append(dataList[i])
        mat.append(rowList)

    return mat

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

>>> C=np.matmul(B,A)

error: ufunc 'matmul' did not contain a loop with signature matching types dtype('S8') dtype('S8') dtype('S8')

Какую функцию я должен использовать?

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Как обсуждалось в комментариях, матрицы A и B имеют шестнадцатеричное значение основания 32, записанное как str. И чтобы выполнить скалярное произведение, нам нужно сначала преобразовать эти значения в целые числа, используя встроенную функцию int(value, base).

Здесь я создал небольшой пример, чтобы объяснить, как процесс должен go :

>>> import numpy as np

>>> A = np.array([[int("FFBCFFA2", 32)],
                  [int("FFBCFFA2", 32)],
                  [int("FFBCFFA2", 32)],
                  [int("FFBCFFA2", 32)]])
>>> A.shape
(4,1)
>>>
>>> B = np.array([[int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32)],
                  [int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32)],
                  [int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32)],
                  [int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32), int("FFBCFFA2", 32)]])
>>> B.shape
(4,4)
>>>
>>> C = np.matmul(A, B)
[[6956274410837382160]
 [6956274410837382160]
 [6956274410837382160]
 [6956274410837382160]]

Как мы видим, выход точечного произведения представляет собой числа, вы можете преобразовать их обратно в шестнадцатеричные значения, используя метод hex():

>>> hex(C[0][0])
0x6089a6b8821a1410

EDIT

Ниже приведен правильный способ конвертации valList в int:

valList = list(map(lambda x: int(x,32), valList))
0 голосов
/ 03 мая 2020

Python имеет операторы для этих случаев использования:

A * B  # dot-product
A @ B  # matrix-multiplication

Оператор умножения матриц является ассоциативным справа.

Если вам нужны эти аргументы в качестве аргументов функции:

import operator
operator.matmul(A, B)
...