【问题标题】:Speed up loops over numpy arrays that modify the array加快修改数组的numpy数组的循环
【发布时间】:2020-10-08 23:29:09
【问题描述】:

我有形状为 (X, Y, 4) 的 numpy 数组,其中 X 和 Y 很大。我想在数组的轴 2 上执行以下操作(即每个 x 和 y 的 A[x, y]):对于每个一维向量 A[x, y],如果前 3 个元素中的每一个都是在常数向量 C 中的对应元素的某个距离 d 内,然后将第 4 个元素设置为 0。这就是我使用 Python 循环的方式:

for i in range(X):
    for j in range(Y):
        if np.all(np.abs(A[i, j, 0:3] - C) <= d):
            A[i, j, 3] = 0

显然,这些循环非常慢。我怀疑有一种更快的、基于 ufunc 的方式来执行此操作,但对于我的生活来说,我无法弄清楚如何去做。有人有什么建议吗?

(应用注意:这是为图像添加alpha通道,使接近C的颜色变得透明。)

【问题讨论】:

  • 嗨,这可能是题外话,但我想问一个问题。建议使用哪种形状的图像?是(X, Y, 3) 还是(3, X, Y)
  • @mathfux 你最喜欢的库支持的那个

标签: python numpy numpy-ufunc


【解决方案1】:

试试:

mask = (np.abs(A[:,:,:3]-C)<=d).all(-1)
A[mask,3] = 0

【讨论】:

  • 非常感谢!正是我一直在寻找的那种东西。对于 120x120 的无符号字节数组,您的解决方案需要 0.42 毫秒,而我的解决方案需要 77 毫秒。有充分理由更仔细地研究 numpy 索引!
  • 如果您有未签名的数据,请小心!我愿意,因为我的数据是 0 到 255 之间的 RGB 值,所以我的数据是 uint8。对于无符号数据,当您在 Quang 的代码中执行 A[:,:,:3]-C 减法时,例如,当您执行 60-61 时,您会得到 255,而不是预期的 -1。减法后,您需要将数据更改为有符号类型。比如你的数据是uint8,那么Quang的第一行代码应该改成mask = (np.abs((A[:,:,:3]-C).astype(np.int8))&lt;=d).all(-1)
猜你喜欢
  • 2019-08-07
  • 2017-03-14
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2013-02-18
  • 2021-09-24
相关资源
最近更新 更多