Numpy通过字典广播

时间:2015-08-27 07:21:56

标签: python arrays numpy dictionary

我有一个二维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方式"做这样的事情?

1 个答案:

答案 0 :(得分:5)

这是一个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]])