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