为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Numpy 进行矩阵运算的更简单方法

使用 Numpy 进行矩阵运算的更简单方法

三国纷争 2021-09-24 16:40:19
我有一个这样的代码:x = 0for i in range(100):    for j in range(100):        x += f[i, 0] * f[0, j]这f是一个二维数组。现在,numpy 中是否有可用的函数可以在不使用 for 循环的情况下执行此操作?
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您可以独立地对第一列和第一行求和,然后取乘积:


res = f[:, 0].sum() * f[0, :].sum()

这里有一些代码来检查这是否符合您的期望:


np.random.seed(0)


f = np.random.random((100, 100))


x = 0

for i in range(100):

    for j in range(100):

        x += f[i, 0] * f[0,j]


res = f[:, 0].sum() * f[0, :].sum()


assert np.isclose(x, res)


查看完整回答
反对 回复 2021-09-24
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

是的,您可以使用 NumPy 的outer(). 这基本上是一个外积问题,您只需将结果外积 n*n 矩阵的元素相加即可。在这里,您在矩阵中使用的唯一值是第一行和第一列。


因此,您需要做的就是使用np.outer( docs )取第一行和第一列的外积。这就是您在使用嵌套 for 循环的算法中所做的一切。


例子


import numpy as np


f = np.random.randint(1, 9, (3, 3)) # Create a test 3x3 matrix 


col = f[:, 0] # first column enteries [5, 3, 8]

row = f[0, :] # first row enteries [5, 3, 4]

summ = np.sum(np.outer(row, col))


print (f)

print ('The sum is %d' %summ)


#[[5 3 4]

# [3 8 1]

# [8 7 2]]


# The sum is 192

hpaulj建议的替代方案是


np.einsum('i,j->', f[:,0], f[0,:])


查看完整回答
反对 回复 2021-09-24
  • 2 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号