Python numpy—为2d数组中的每对行计算f(v1,v2)的最有效方法
假设我有一个2d(正方形)矩阵和一个函数:Python numpy—为2d数组中的每对行计算f(v1,v2)的最有效方法,python,numpy,matrix,Python,Numpy,Matrix,假设我有一个2d(正方形)矩阵和一个函数: import numpy as np data = np.random.rand(10000, 10000) def func(v1, v2): n1, n2 = np.linalg.norm(v1), np.linalg.norm(v2) return(np.dot(v1, v2) / (n1 * n2)) 我想计算'data'中每对行的'func',并将其保存到输出矩阵'out'。因此基本上相当于: out = np.ndarr
import numpy as np
data = np.random.rand(10000, 10000)
def func(v1, v2):
n1, n2 = np.linalg.norm(v1), np.linalg.norm(v2)
return(np.dot(v1, v2) / (n1 * n2))
我想计算'data'中每对行的'func',并将其保存到输出矩阵'out'。因此基本上相当于:
out = np.ndarray(data.shape)
for i in range(data.shape[0]):
for j in range(data.shape[1]):
out[i,j] = func(data[i, :], data[j, :])
显然,上述方法速度非常慢且效率低下。在这样的数组中,迭代行对(通常是元组)的最佳(num)python方式是什么?给定的“func”是一个任意的R^n x R^n->R函数。如果您有一个通用函数,则更通用的方法是使用
np.fromiter
(这通常比循环更快):
func
是您正在使用的实际函数还是只是一个演示函数?@Divakar这是两个向量之间夹角的余弦函数示例。想要使用比点积更复杂的东西,因为这可以用np.inner(data,data)@Divakar来解决,当然这个可以通过首先缩放向量来简化
import itertools
n = 4
data = np.random.random((n, n))
def func(tup):
v1, v2 = tup
n1, n2 = np.linalg.norm(v1), np.linalg.norm(v2)
return(np.dot(v1, v2) / (n1 * n2))
out = np.fromiter(map(func, itertools.product(data, data)), np.float).reshape(n,n)
print(out)
>>array([[1. , 0.57588563, 0.44980109, 0.93490176],
[0.57588563, 1. , 0.71004626, 0.6908402 ],
[0.44980109, 0.71004626, 1. , 0.68118222],
[0.93490176, 0.6908402 , 0.68118222, 1. ]])