【问题标题】:Replace all -1 in numpy array with values from another array用另一个数组中的值替换 numpy 数组中的所有 -1
【发布时间】:2020-03-18 20:56:14
【问题描述】:

我有两个 numpy 数组,例如。 g.:

x = np.array([4, -1, 1, -1, -1, 2])
y = np.array([1, 2, 3, 4, 5, 6])

我想将x 中的所有-1 替换为y 中的数字,而不是x 中的数字。第一个-1,第一个数字在y,但不在x (3),第二个-1,第二个数字在y,不在x (5),.. . 所以最终的x 应该是:

[4 3 1 5 6 2]

我创建了这个函数:

import numpy as np
import time

start = time.time()

def fill(x, y):
    x_i = 0
    y_i = 0

    while x_i < len(x) and y_i < len(y):
        if x[x_i] != -1: # If current value in x is not -1.
            x_i += 1
            continue

        if y[y_i] in x: # If current value in y is already in x.
            y_i += 1
            continue

        x[x_i] = y[y_i] # Replace current -1 in x by current value in y.


for i in range(10000):
    x = np.array([4, -1, 1, -1, -1, 2])
    y = np.array([1, 2, 3, 4, 5, 6])
    fill(x, y)

end = time.time()
print(end - start) # 0.296

它正在工作,但我需要多次运行此功能(例如百万次),所以我想优化它。有什么办法吗?

【问题讨论】:

  • 你从y得到的数字的顺序重要吗?
  • 这个数组x = np.array([4, -1, 1, -1, -1, 2, -1, -1, -1])应该如何替换(假设y相同)?
  • 如果数字少于 -1 出现的次数会怎样?
  • y 中的数字总是足够的。其他情况无需解决。
  • @ashiswin 是的,顺序很重要。

标签: python arrays python-3.x numpy optimization


【解决方案1】:

你可以这样做:

import numpy as np

x = np.array([4, -1, 1, -1, -1, 2])
y = np.array([1, 2, 3, 4, 5, 6])

# create set of choices
sx = set(x)
choices = np.array([yi for yi in y if yi not in sx])

# assign new values
x[x == -1] = choices[:(x == -1).sum()]

print(x)

输出

[4 3 1 5 6 2]

【讨论】:

    【解决方案2】:
    y_not_in_x = np.setdiff1d(y, x)
    x_eq_neg1 = x == -1
    n_neg1s = np.sum(x_eq_neg1)
    x[x_eq_neg1] = y_not_in_x[:n_neg1s]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2016-02-21
      • 2021-01-22
      相关资源
      最近更新 更多