Итерация функции по массиву

#python #arrays #function #numpy #mask

Вопрос:

По-другому сформулируйте название этого вопроса.

У меня есть функция, которая берет трехмерный массив и маскирует определенные элементы внутри массива в зависимости от конкретных условий. Смотреть ниже:

 #function for array masking  def masc(arr,z):  return(np.ma.masked_where((arr[:,:,2] lt;= z 0.05)*(arr[:,:,2] gt;= z-0.05), arr[:,:,2]))     

arr-это 3D-массив, а z-одно значение.

Теперь я хочу повторить это для нескольких значений Z. Вот пример со значениями 2 z:

 masked_array1_1 = masc(xyz,z1) masked_array1_2 = masc(xyz,z2)  masked_1 = masked_array1_1.mask   masked_array1_2.mask masked_array1 = np.ma.array(xyz[:,:,2],mask=masked_1)   

masked_array1 дает мне именно то, что я ищу.

Я начал писать запрос, чтобы повторить это над 1D массивом Z значений:

 mask_1 = xyz[:,:,2] for i in range(Z_all_dim):  mask_1  = (masc(xyz,Z_all[i]).mask)  masked_array1 = np.ma.array(xyz[:,:,2], mask = mask_1)   

Z_all-это массив из 7 уникальных значений z. Этот код не работает (весь массив оказывается замаскированным), но я чувствую, что я очень близок. Кто — нибудь видит, не делаю ли я что-то не так?

Комментарии:

1. возможно, сначала разделите код на простые команды и используйте print() , чтобы увидеть, что у вас есть в переменных в разные моменты — это называется "print debuging"

2. Ваша функция masc(arr,z) хочет один массив arr и скалярный z, но вы скармливаете ей кучу вещей — (xyz,IWX_new[0],IWY_new[0],MWX[0],MWY[0],Z_all[i])

3. @jeremy_rutman стреляй. Спасибо, что заметили это. Я достал кучу других вещей, которые не были полезны для вопроса, но забыл об этом.

Ответ №1:

Ваша проблема в том, что перед циклом, с которого вы начинаете mask_1 = xyz[:,:,2] . Добавление логического массива в значение с плавающей запятой приведет к приведению логического значения к 1 и 0, и если в вашем массиве с плавающей запятой нет 0, то в конечном массиве будут все ненулевые значения, что затем приведет к маскировке каждого значения. Вместо этого сделайте

 mask_1 = masc(xyz, Z_all[0]).mask for z in Z_all[1:]:  mask_1  = masc(xyz, z).mask  

Или избегать каких-либо циклов и транслировать свои операции

 # No need to pass it through `np.ma.masked_where` if # you're just going to extract just the boolean mask mask = (xyz[...,2,None] lt;= Z_all   0.05) * (xyz[...,2,None] gt;= Z_all - 0.05) mask = np.any(mask, axis=-1)  

Комментарии:

1. Спасибо! Работает отлично.