Python中NxM的矩阵乘法
Python中有两个矩阵:形状(4,1)的矩阵A和形状(4,4)的矩阵B。 我使用列表中的数据形成了两个矩阵 valList数据看起来像Python中NxM的矩阵乘法,python,numpy,matrix,matrix-multiplication,Python,Numpy,Matrix,Matrix Multiplication,Python中有两个矩阵:形状(4,1)的矩阵A和形状(4,4)的矩阵B。 我使用列表中的数据形成了两个矩阵 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
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')
我应该使用什么函数?Python为这些用例提供了运算符:
A * B # dot-product
A @ B # matrix-multiplication
矩阵乘法运算符是右结合的
如果需要这些参数作为函数参数:
import operator
operator.matmul(A, B)
Python为这些用例提供了运算符:
A * B # dot-product
A @ B # matrix-multiplication
矩阵乘法运算符是右结合的
如果需要这些参数作为函数参数:
import operator
operator.matmul(A, B)
如评论中所述,矩阵
A
和B
的基数为32的十六进制十进制值写为str
。要执行点积,首先需要使用内置函数int(value,base)
将这些值转换为整数
在这里,我创建了一个小示例来解释流程应该如何进行:
>>> 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
编辑
以下是将valList
转换为int
的正确方法:
valList = list(map(lambda x: int(x,32), valList))
如评论中所述,矩阵
A
和B
的基数为32的十六进制十进制值写为str
。要执行点积,首先需要使用内置函数int(value,base)
将这些值转换为整数
在这里,我创建了一个小示例来解释流程应该如何进行:
>>> 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
编辑
以下是将valList
转换为int
的正确方法:
valList = list(map(lambda x: int(x,32), valList))
我认为这个答案不能解决用户的错误,因为他们在使用
matmul
时遇到的错误是“错误:ufunc'matmul'不包含签名匹配类型dtype('S8')dtype('S8')dtype('S8')dtype('S8')”的循环”。我认为这个答案不能解决用户的错误,因为他们在使用matmul
时遇到的错误是“错误:ufunc'matmul'不包含签名匹配类型为dtype('S8')dtype('S8')dtype('S8')的循环('S8')”“我认为问题在于A
和B
矩阵的数据类型。”。。你能把它们的值放在问题中吗?我假设dataList
有所有的数字,那么你需要更改numpy数组的数据类型,比如A=A.astype(“float64”)
和B=B.astype(“float64”)
在运行C
之前,我尝试了这个…它让我无法将字符串转换为浮点:列表中的数据项是例如FFBCFFA2So,您愿意如何对字符串执行点积?如何将字符串列表转换为32位十六进制数?我认为问题在于a
和B
矩阵的数据类型。。你能把它们的值放在问题中吗?我假设dataList
有所有的数字,那么你需要更改numpy数组的数据类型,比如A=A.astype(“float64”)
和B=B.astype(“float64”)
在运行C
之前,我尝试了这个…它让我无法将字符串转换为浮点:列表中的数据项是例如FFBCFFA2So,您愿意如何对字符串执行点积?如何将字符串列表转换为32位十六进制数?我更新了查询…在使用form matrix函数之前,我尝试将列表更改为32位,错误似乎保持不变..你能看一下更新的代码吗?我更新了我的查询…我在使用表单矩阵函数之前尝试将列表更改为32位,错误似乎保持不变..你能看一下更新的代码吗?