如何在 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 数组上定义一个使用数组索引查找字典的函数?的主要内容,如果未能解决你的问题,请参考以下文章