【问题标题】:Can I create a numpy array of dictionary values from an array of dictionary keys?我可以从字典键数组创建一个 numpy 字典值数组吗?
【发布时间】:2019-11-23 16:23:48
【问题描述】:

假设我有一本字典:

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

给定一个 numpy 键数组**,例如['a' 'c' 'e'],有没有一种简单的方法来创建相应值的 numpy 数组,例如[1 3 5]?

** 出于我在其中使用它的上下文的原因,我更喜欢输入/输出 numpy 数组。显然可以用列表来做类似的事情:

keys = ['a', 'c', 'e']
values = []

for k in keys:
    values.append(d[k])

print(values)
[1, 3, 5]

但我想知道在 numpy 中是否有内置的方法来做这样的事情。

【问题讨论】:

  • 不,编译后的numpy 代码对字典没有任何特殊意义。

标签: python arrays numpy dictionary


【解决方案1】:

您可以使用structured arraynp.in1d 来做到这一点。

import numpy as np

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

# Create structured array (modify formats, names as necessary):
names = ['key', 'data']  
formats = ['U10', 'i4']                                                                        
dtype = dict(names = names, formats = formats)

arr = np.array(list(d.items()), dtype=dtype)

# >>> arr
# array([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)],
#       dtype=[('key', '<U10'), ('data', '<i4')])

# use np.in1d to get your keys:

keys = ['a', 'c', 'e']

values = arr[np.in1d(arr['key'], keys)]['data']                                                

# >>> values
# array([1, 3, 5], dtype=int32)

【讨论】:

  • 这非常令人费解并且基本上毫无意义(将 O(1) 变成 O(n))。我喜欢它。
【解决方案2】:

如果您只需要将 numpy 数组作为输入和输出,但不坚持使用 numpy 函数 来处理它们,则可以在列表理解的结果上使用 numpy.array()

import numpy as np

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
keys = np.array(['a', 'c', 'e'])
values = np.array([d[k] for k in keys])

print(values)

【讨论】:

  • 列表推导是一个流线型的 for 循环,但与 OP 的方法相比变化不大。
  • 我仍然建议使用列表推导而不是追加,因为它是much faster
猜你喜欢
  • 2013-11-28
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2021-08-06
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多