在大小不等的数组上有效地将值从一个ndarray复制到另一个ndaray



我有两个大小不同的数组,但我试图用匹配的"键";。我的实际问题可能有很多排,我已经确定这是目前瓶颈我的程序。

编辑:我没有意识到a1中可能有重复的值,应该保持重复我在np.array示例中添加了一个这样的示例。

示例:

import numpy as np
# first two columns are 'keys', overwrite the 3rd column in a1 with the 3rd column from a2
# some values may be missing from a2. Those should keep the value in a1
a1 = np.array([[ 0.0,  2.0,  10.0 ],
[ 0.0,  2.0,  10.0 ],
[ 0.0,  3.0,  10.0 ],
[ 1.0,  3.0,  10.0 ],
[ 1.0, 13.0,  10.0 ],
[ 2.0,  2.0,  10.0 ],
[ 2.0,  5.0,  10.0 ]])
a2 = np.array([[ 0.0,  2.0,  0.0   ],
[ 0.0,  3.0,  0.713 ],
[ 1.0,  3.0,  0.713 ],
[ 1.0, 13.0,  1.0   ],
[ 2.0,  2.0,  0.0   ]])
# wanted result:
np.array([[ 0.0,  2.0,  0.0   ],
[ 0.0,  2.0,  0.0   ],
[ 0.0,  3.0,  0.713 ],
[ 1.0,  3.0,  0.713 ],
[ 1.0, 13.0,  1.0   ],
[ 2.0,  2.0,  0.0   ],
[ 2.0,  5.0,  10.0   ]])

当我使用这种暴力时,我会简单地获取a2中的每一行,并在a1中的每行中循环,以替换匹配项上的值,但有没有一种方法可以更有效地运行呢?有什么方法可以对至少一个循环的操作进行矢量化?我的实际案例涉及两个数组中的许多行,这需要很长时间。

你会考虑像Pandas这样的其他包吗?

import pandas as pd
d2 = pd.DataFrame(a2).set_index([0,1])
d1 = pd.DataFrame(a1).set_index([0,1])
d1.update(d2)
d1.reset_index().values

输出:

array([[ 0.   ,  2.   ,  0.   ],
[ 0.   ,  2.   ,  0.   ],
[ 0.   ,  3.   ,  0.713],
[ 1.   ,  3.   ,  0.713],
[ 1.   , 13.   ,  1.   ],
[ 2.   ,  2.   ,  0.   ],
[ 2.   ,  5.   , 10.   ]])

连接a2a1,并只为前两列保留唯一的行。

a_all = np.r_[a2, a1]
a_all = a_all[np.unique(a_all[:, :2], axis=0, return_index=True)[1]]

如果第三列正在更新,并且您希望使用pandas:

import numpy as np
import pandas as pd
a1 = np.array([[ 0.0,  2.0,  10.0 ],
[ 0.0,  2.0,  10.0 ],
[ 0.0,  3.0,  10.0 ],
[ 1.0,  3.0,  10.0 ],
[ 1.0, 13.0,  10.0 ],
[ 2.0,  2.0,  10.0 ],
[ 2.0,  5.0,  10.0 ]])
a2 = np.array([[ 0.0,  2.0,  0.0   ],
[ 0.0,  3.0,  0.713 ],
[ 1.0,  3.0,  0.713 ],
[ 1.0, 13.0,  1.0   ],
[ 2.0,  2.0,  0.0   ]])

d1 = pd.DataFrame(a1)
d2 = pd.DataFrame(a2)
d3 = d2.set_index([0,1])[[2]].combine_first(d1.set_index([0,1])[[2]]).reset_index().to_numpy()
d3

输出:

array([[ 0.   ,  2.   ,  0.   ],
[ 0.   ,  2.   ,  0.   ],
[ 0.   ,  3.   ,  0.713],
[ 1.   ,  3.   ,  0.713],
[ 1.   , 13.   ,  1.   ],
[ 2.   ,  2.   ,  0.   ],
[ 2.   ,  5.   , 10.   ]])

最新更新