Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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—为2d数组中的每对行计算f(v1,v2)的最有效方法_Python_Numpy_Matrix - Fatal编程技术网

Python numpy—为2d数组中的每对行计算f(v1,v2)的最有效方法

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

假设我有一个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.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.        ]])