【问题标题】:Search for value from one array in another array and modify array if not found - numpy从另一个数组中的一个数组中搜索值,如果找不到则修改数组 - numpy
【发布时间】:2015-03-01 05:30:08
【问题描述】:

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

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 函数对其进行矢量化?

【问题讨论】:

  • 您是否尝试过直接的蛮力方法?需要多长时间?
  • 你别无选择,你必须以任何方式循环N
  • 来自C++ 背景,我第一次解决问题是循环,但我一直发现有更多“Pythonic”方法可以实现我想要的......蛮力大约需要 10 到我的数据 15 分钟。我希望内部 numpy 代码可以处理循环 N

标签: python arrays algorithm numpy


【解决方案1】:

可以找到要替换的索引:

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]

【讨论】:

  • 很好的逻辑。奇迹般有效!虽然,对于我的具体情况,最终的替换语句应该是a[ind, a.shape[0]] = b[ind],因为我只想替换最后一个元素。
  • 似乎我们正在将差异与一个非常小的值进行比较TOL。 1.e-6 是 Python 中的某种形式的限制,还是这是任意的,在这种情况下,匹配将精确到小数点后 6 位?
  • @RazorXsr 如果您正在处理整数 np.where(~(s == 0)) 就好了。使用公差使其更通用。
  • @RazorXsr 来自您的第一条评论...也许您想要a[ind, ind:] = b[ind][:, None]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多