gpt4 book ai didi

python - 广播/迭代字典值的有效方法

转载 作者:行者123 更新时间:2023-11-30 21:50:56 29 4
gpt4 key购买 nike

我正在尝试在计算中使用字典值,如下所示:

mydict = dict(zip(['key1', 'key2', 'key3'],
[1, 2, 3]))
print(mydict)

newvals = (mydict.values() + 3) ** 2
print(newvals)
{'key1': 1, 'key2': 2, 'key3': 3}
TypeError: unsupported operand type(s) for +: 'dict_values' and 'int'

或者如果我这样做,

import numpy as np
newvals = (np.array(mydict.values()) + 3) ** 2
print(newvals)
TypeError: unsupported operand type(s) for +: 'dict_values' and 'int'

看来我必须首先将字典值转换为列表,或者使用列表理解进行迭代。

newvals = (np.array(list(mydict.values())) + 3) ** 2
print(newvals)
[16 25 36]

或者我也可以

newvals = np.array([(val + 3) ** 2 for val in mydict.values()])
print(newvals)
[16 25 36]

有没有更简单或更有效的方法来做到这一点?或者是否有一个内置的字典方法可供我使用,这样我就不必使用列表理解或 for 循环?

谢谢。

最佳答案

当我们谈论避免 numpy 中的循环时,我们实际上的意思是避免 Python 级别的循环。我们仍然需要循环遍历数组元素,但我们是在快速编译的代码中完成的。该代码仅适用于 numpy ndarrays。此外,通过数组的循环比通过列表的循环更糟糕。

如果我们从列表开始,我们必须首先将其转换为 ndarray,例如arr = np.array([1,2,3])。数组转换需要足够的时间,因此通常进行列表理解会更快。

numpy 没有任何代码可以直接使用 Python dictsvalues() 创建一个类似生成器的对象。 np.array(...) 需要一个类似对象的列表:

In [140]: np.array(list(mydict.values()))                                                      
Out[140]: array([1, 2, 3])
In [141]: (np.array(list(mydict.values())) +3)**2
Out[141]: array([16, 25, 36])

fromiter 可以从 values 对象工作:

In [142]: np.fromiter(mydict.values(), int)                                                    
Out[142]: array([1, 2, 3])

np.fromiter 可能比 np.array 更快,但我不能保证。

我怀疑列表理解更快,特别是对于这个小例子:

In [143]: [(x+3)**2 for x in mydict.values()]                                                  
Out[143]: [16, 25, 36]

我们可以进行一些时间测试,但对于这个小样本,它可能不会那么有用。

字典对很多事情都有用,但快速数值计算并不是其中之一。

关于python - 广播/迭代字典值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60244844/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com