【问题标题】:Numpy broadcast through dictionaryNumpy 通过字典广播
【发布时间】:2015-11-21 11:07:04
【问题描述】:

我有一个二维 numpy 数组和一个字典,它将数组第一列中的值映射到其他值。例如:

>>> x = np.array([[14, 4], [18, 2], [15, 7]])
>>> d = {5: 0, 7: 2, 14: 3, 15: 12, 16: 10, 18: 30}

d 中的所有键都不能保证在x 中,尽管x 第一列中的所有值都将在d 中。我想要做的是将x 第一列中的值替换为d 中的相关值。比如:

>>> x[:, 0] = d[x[:, 0]]

所以新数组是:

>>> x
array([[3, 4], [30, 2], [12, 7]])

当然,这不起作用,因为我基本上只是将整个数组传递到需要一个键的字典中。我想出的最好的方法是使用for 循环:

>>> for i in range(x.shape[0]):
...     x[i, 1] = d[x[i, 1]]

这当然是非常非 numpy 并且可能没有那么高效。我的问题是,有没有一种“麻木的方式”来做这样的事情?

【问题讨论】:

  • 那么最终输出必须是什么?
  • @Divakar - 为您添加了示例输出。
  • x 第一列中的所有值都保证在d 的键中吗?
  • @Divakar - 是的,如果它在x 的第一列中,就会有一个密钥。

标签: python arrays numpy dictionary


【解决方案1】:

这是一个 Numpythonic 解决方案 -

# Extract values and keys
dv = np.array(list(d.values()))
dk = np.array(list(d.keys()))

# Get positions of keys in first column of x and thus change the first column
_,C = np.where(x[:,0][:,None] == dk)
x[:,0] = dv[C]

示例运行 -

In [107]: x
Out[107]: 
array([[15,  4],
       [18,  2],
       [14,  7]])

In [108]: d
Out[108]: {16: 10, 18: 3, 5: 0, 7: 2, 14: 12, 15: 30}

In [109]: # Extract values and keys
     ...: dv = np.array(list(d.values()))
     ...: dk = np.array(list(d.keys()))
     ...: 
     ...: # Get positions of keys in first column of x and thus change the first column
     ...: _,C = np.where(x[:,0][:,None] == dk)
     ...: x[:,0] = dv[C]
     ...: 

In [110]: x
Out[110]: 
array([[30,  4],
       [ 3,  2],
       [12,  7]])

【讨论】:

  • 谢谢。虽然只是想知道,但这是否需要使用有序字典或分别对字典键和值进行排序以确保顺序?
【解决方案2】:

如果您的字典键小而正:

lookup = np.arange(max(d) + 1)  # or max(x[:,0])
lookup[list(d.keys())] = np.array(d.values())

x[:,0] = lookup[x[:,0]]

【讨论】:

  • 谢谢。我正在考虑朝那个方向发展,但不幸的是,字典可能有一些相当大的键(或者更具体地说,键的大小没有上限)。
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多