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

Posted

技术标签:

【中文标题】如何在 numpy 数组上定义一个使用数组索引查找字典的函数?【英文标题】:How to define a function on numpy array that uses array indexes to lookup a dictionary? 【发布时间】:2021-04-12 06:30:36 【问题描述】:

我有一个大小为 (150,000 * 150,000) 的大型 numpy 矩阵“垫子”。我正在尝试对这个 numpy 数组的每个元素应用一个函数。该函数使用一个字典,其键范围为 0 到 149,999:

第一步:

将一维数组转换为字典

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

第二步

定义函数:

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]]

这里的垫子尺寸是3*3,但原来的垫子尺寸是150000 * 150000

【问题讨论】:

你能添加一个数据和预期结果的小例子吗?我认为您可以将此操作矢量化并避免循环,但我不确定数据格式。 感谢反馈。刚刚更新了一些示例输入和输出,但是 mat 矩阵的大小为 150,000*150,000。我有大约 500gb 的内存,所以这不是问题! 【参考方案1】:

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

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

array([[0.04 , 0.02 , 0.01 ],
       [0.08 , 0.04 , 0.02 ],
       [0.06 , 0.03 , 0.015]])

【讨论】:

以上是关于如何在 numpy 数组上定义一个使用数组索引查找字典的函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用花哨的索引从 Numpy 数组中查找和删除全零列

在numpy数组上查找所有最大值

Numpy数组索引为-1和None

在 numpy 数组中查找多个值的行索引

如何将 Pandas 查找表应用于 numpy 数组?

在 NumPy 数组中查找等于零的元素的索引