Замените данные в массиве на numpy

#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 помощью .