#python #numpy
Вопрос:
Я использую цифровую модель рельефа в качестве массива, и я хочу создать новый массив только с пикселями ниже определенного значения. Я попробовал использовать цикл for.
Вот операция с более простыми данными :
import numpy as np
array1 = array2 = np.arange(9).reshape(3,3)
array2 = array2.astype("float") #np.nan doesn't work with integers
for row in array2:
for item in row:
if item > 3.0:
item=np.nan
print(np.array_equal(array1,array2))
Массивы остаются равными после завершения цикла. Знаете ли вы, почему значения не будут заменены?
Ответ №1:
Вы только меняете item
, что вам нужно вставить item
array2
, вы можете использовать np.where
, как показано ниже:
>>> array1 = np.arange(9).reshape(3,3)
>>> array2 = np.where(array1 > 3, np.nan, array1)
>>> array2
array([[ 0., 1., 2.],
[ 3., nan, nan],
[nan, nan, nan]])
>>> np.array_equal(array1, array2)
False
Ответ №2:
Значения не заменяются, потому item
что это копия каждого элемента массива.
Кроме того, использование цикла pure-Python неэффективно. Рассмотрите возможность векторизации кода с array2[array2 > 3.0] = np.nan
помощью .