比较两个相同形状的 Numpy 数组,一个针对一组条件,然后更改另一个

Comparing two same-shape Numpy arrays, one against a set of conditions to then change the other one

array_one和array_two可以假设为相同的形状。

我想针对两个条件(它不是“invalid_data”并且值是“list_of_desired_values”中的数字之一)测试 array_two。

对于 array_two 这些条件被认为成立的索引,我想在这种情况下将同一索引处的 array_one 更改为 -9999。

我无法让它工作,理想情况下,我希望能够在 Numpy 中执行此操作,而不是使用 for 循环来提高速度。有谁知道这样做的有效方法吗?

    invalid_data = 5 #example
    list_of_desired_values = [11, 2]
    array_one = numpy.array([[2, 4, 6], [6, 8, 10]], numpy.int32)
    array_two = numpy.array([[5, 2, 1], [7, 11, 55]], numpy.int32)
    for x in array_two.flatten():
        if array_two.flatten()[x] != invalid_data:
            if array_two.flatten()[x] in list_of_desired_values:
                array_one.flatten()[x] = -9999

您的代码有 2 个缺陷:

  1. for x in array_two.flatten():x设置为 每个元素,所以将它用作索引是没有意义的(index out of bounds异常很可能发生)。

  2. array_one.flatten()[x] = -9999 也没有意义,因为结果 array_one.flatten() 另一个 (临时)数组,然后 立即消失(flatten() returns 源数组的 copy, 折叠成一维)。

您的代码可以修改为:

for idx, x in np.ndenumerate(array_two):
    if x != invalid_data:
        if x in list_of_desired_values:
            array_one[idx] = -9999

但正确的 numpythonic 解决方案是仅参考 array_one 使用布尔索引(符合您标准的索引)并设置在那里 您的目标值:

array_one[np.logical_and(np.not_equal(array_two, invalid_data),
    np.isin(array_two, list_of_desired_values))] = -9999

结果(array_one经过此操作)为:

array([[   2, -9999,    6],
       [   6, -9999,   10]])