Python 3.x 如何在numpy数组上定义一个使用数组索引查找字典的函数?

Python 3.x 如何在numpy数组上定义一个使用数组索引查找字典的函数?,python-3.x,pandas,numpy,vectorization,Python 3.x,Pandas,Numpy,Vectorization,我有一个大的numpy矩阵“mat”,大小为(150000*150000)。我试图在这个numpy数组的每个元素上应用一个函数。该函数使用键范围为0到149999的字典: 步骤1: 将一维数组转换为字典 dict1 = dict(enumerate(arr)) # arr is a 1d array of size (150,000*1) 步骤2 定义功能: def find_res(mat): #Psuedo code for each element 'e' in the ar

我有一个大的numpy矩阵“mat”,大小为(150000*150000)。我试图在这个numpy数组的每个元素上应用一个函数。该函数使用键范围为0到149999的字典:

步骤1:

将一维数组转换为字典

dict1 = dict(enumerate(arr)) # arr is a 1d array of size (150,000*1)
步骤2

定义功能:

def find_res(mat):  #Psuedo code
    for each element 'e'  in the array, obtain the row index i and column index j
    return e/(dict1[i]*dict1[j])
将函数矢量化并查找结果

vfunc = np.vectorize(find_res)
res = vfunc(mat)
我想知道如何定义find_res函数。也许他们的方法更好

样本数据

arr = np.array([5,10,20])
dict1 = dict(enumerate(arr))

print(dict1)
-> {0:5, 1:10, 2:20}

print(mat)
->
[[1 1 1]
 [4 4 4]
 [6 6 6]]

output:
print(vfunc(mat))
->

[[0.04 0.02 0.01]
 [0.08 0.04 0.02 ]
 [0.06 0.03 0.015]]


这里的mat大小是3*3,但是原始mat大小是150000*150000

我认为没有必要从
1-d
数组创建字典。您可以通过取外积直接变换
arr
,然后您可以将矩阵除以此变换后的
arr
得到最终结果:

mat / (arr[:, None] * arr)


你能添加一个数据和预期结果的小例子吗?我认为您可以矢量化此操作并避免循环,但我不确定数据格式。感谢您的反馈。刚刚更新了一些示例输入和输出,但是mat矩阵的大小为150000*150000。我有大约500gb的内存,所以这不是问题!
array([[0.04 , 0.02 , 0.01 ],
       [0.08 , 0.04 , 0.02 ],
       [0.06 , 0.03 , 0.015]])