比较两个相同形状的 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 个缺陷:
在for x in array_two.flatten():
中x设置为值
每个元素,所以将它用作索引是没有意义的(index out
of bounds异常很可能发生)。
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]])
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 个缺陷:
在
for x in array_two.flatten():
中x设置为值 每个元素,所以将它用作索引是没有意义的(index out of bounds异常很可能发生)。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]])