Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Numpy进行矩阵运算的更简单方法_Python_Arrays_Algorithm_Numpy_Matrix - Fatal编程技术网

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中完成。