Python 使用Numpy进行矩阵运算的更简单方法
我有这样一个代码:Python 使用Numpy进行矩阵运算的更简单方法,python,arrays,algorithm,numpy,matrix,Python,Arrays,Algorithm,Numpy,Matrix,我有这样一个代码: x = 0 for i in range(100): for j in range(100): x += f[i, 0] * f[0, j] 这里的f是一个二维数组。现在,numpy中是否有一个函数可用于执行此操作而无需使用for循环?您可以独立地对第一列和第一行求和,然后取乘积: res = f[:, 0].sum() * f[0, :].sum() 下面是一些代码来检查这一点,以满足您的期望: np.random.seed(0) f = np
x = 0
for i in range(100):
for j in range(100):
x += f[i, 0] * f[0, j]
这里的
f
是一个二维数组。现在,numpy中是否有一个函数可用于执行此操作而无需使用for循环?您可以独立地对第一列和第一行求和,然后取乘积:
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)
您可以将第一列和第一行分别相加,然后取乘积:
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)
是的,您可以使用NumPy的
outer()
。这基本上是一个外积问题,你只需将得到的外积n*n矩阵的元素求和。这里,您在矩阵中使用的唯一值是第一行和第一列
因此,您需要做的就是使用np.outer
()获取第一行和第一列的外积。这就是使用嵌套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
is建议的备选方案
是的,您可以使用NumPy的
outer()
。这基本上是一个外积问题,你只需将得到的外积n*n矩阵的元素求和。这里,您在矩阵中使用的唯一值是第一行和第一列
因此,您需要做的就是使用np.outer
()获取第一行和第一列的外积。这就是使用嵌套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
is建议的备选方案
使用
np.einsum
:np.einsum('i,j->',f[:,0],f[0,:])也一样。外面的部分很简单。我不得不反复思考如何告诉它求和(空的->
)。值得注意的是,几乎任何像原始问题中那样的嵌套求和都可以使用einsum在numpy中完成。使用np.einsum
:np.einsum('I,j->',f[:,0],f[0,:])
。外面的部分很简单。我不得不反复思考如何告诉它求和(空的->
)。值得注意的是,几乎任何原始问题中的嵌套求和都可以使用einsum在numpy中完成。