如何使用numpy数组和numpy.where替换数组的值

时间:2016-04-16 00:17:23

标签: python arrays numpy

我有一些数据:

data1={'v': [(0, 103), (1, 4), (2, 50), (3, 101), (4, 156), (5, 110)]}
data2=[[2, 1, 1.0], [2, 0, 1.0], [3, 0, 1.0], [3, 2, 1.0], [4, 2, 1.0], [4, 0, 1.0], [5, 3, 1.0], [5, 0, 1.0], [1, 3, 1.0], [1, 0, 1.0]]

现在,我想用data2中的data1的第二个元组值替换每个第一个元组值。例如,我想在data2中将103替换为103,这可以使用下面的代码完成,但我想跟踪是否有一个替换,以便另一个不再发生在那个位置像1被4(第二元组)取代,然后4本身被196替换,这反过来导致替换为1 - > 196。这是我不想要的。那么有人可以帮助我防止这种情况吗?

data2=numpy.array([[2, 1, 1.0], [2, 0, 1.0], [3, 0, 1.0], [3, 2, 1.0], [4, 2, 1.0], [4, 0, 1.0], [5, 3, 1.0], [5, 0, 1.0], [1, 3, 1.0], [1, 0, 1.0]])

for i in range(len(data1.values()[0])):
    data2=numpy.where(data2==data1.values()[0][i][0],data1.values()[0][i][1],data2)

1 个答案:

答案 0 :(得分:0)

这看起来像是一个更适合使用另一个dict和list comp的工作,其中dict是要替换的每个元素的映射,以及:

data1 = {'v': [(0, 103), (1, 4), (2, 50), (3, 101), (4, 156), (5, 110)]}
data2 = [[2, 1, 1.0], [2, 0, 1.0], [3, 0, 1.0], [3, 2, 1.0], [4, 2, 1.0], [4, 0, 1.0], [5, 3, 1.0], [5, 0, 1.0],
         [1, 3, 1.0], [1, 0, 1.0]]
repl = dict(*data1.values())

data2[:] = [[repl.get(ele, ele) for ele in sub] for sub in data2]

print(data2)

如果ele在dict中,它将被值替换,如果不是仅保留原始元素。这比你自己的numpy方法快得多。为什么逻辑失败的原因是您在循环中反复重新分配data2,以便最终替换已替换的值。你需要做一次赋值,但是再次使用带有dict映射的纯python来实现这一点非常简单。