从另一个数组中的一个数组中搜索值,如果找不到则修改数组 - numpy

时间:2015-03-01 05:30:08

标签: python arrays algorithm numpy

我有一个a形状(N,k)的数组和另一个形状为b的数组(N,)。我想检查b中的{em> ith 值是否包含在a[i]中。如果不存在,我想将a[i,k]替换为b[i]。一个例子:

a = np.array([[1,  2, 2, 3,  4, 5],
              [1,  2, 3, 3,  4, 5],
              [1,  2, 3, 4,  4, 5],
              [1,  2, 3, 4,  5, 5],
              [1,  2, 3, 4,  5, 6]])

b = np.array([1,7,3,8,9])

输出数组应如下所示:

np.array([[1,  2, 2, 3,  4, 5],
          [1,  2, 3, 3,  4, 7],
          [1,  2, 3, 4,  4, 5],
          [1,  2, 3, 4,  5, 8],
          [1,  2, 3, 4,  5, 9]])

N上编写循环似乎非常低效。在我的数据集中,N通常为1000万,而k约为50到100.是否有一种使用numpy函数对其进行矢量化的有效方法?

1 个答案:

答案 0 :(得分:2)

可以找到要替换的索引:

s = a - b[:, None]
TOL = 1.e-6
ind = np.where(~(np.abs(s) <= TOL).any(axis=1))[0]

并且感谢NumPy的花哨索引,您可以在没有for循环的情况下就地更新阵列:

a[ind, :] = b[ind][:, None]