2017-01-05 1 views
1

J'ai un tableau 3D, à savoir param:Masque en dehors d'un intervalle de deux tableaux 2D?

param.shape = (20, 50, 50) 

Je veux masquer son premier axe en dehors d'un intervalle, soit deux tableaux 2D, bot et top:

bot.shape = (50, 50) 
top.shape = (50, 50) 

Ce que j'ai essayé est:

bot_n = np.broadcast_to(bot[0, :, :], param.shape) 
top_n = np.broadcast_to(top[0, :, :], param.shape) 
output = np.ma.masked_outside(param, bot_n, top_n) 

Mais je suis l'erreur suivante:

if v2 < v1:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

En fait, je veux extraire la valeur de param qui se situe entre bot et top valeurs.

Répondre

0

Vous pouvez construire vous-même masque:

output = np.ma.array(param, (param < bot_n) & (param > top_n)) 
0

Le code pour masked_outside est assez simple:

if v2 < v1: 
    (v1, v2) = (v2, v1) 
xf = filled(x) 
condition = (xf < v1) | (xf > v2) 
return masked_where(condition, x, copy=copy) 

L'expression condition1 devrait fonctionner avec votre tableau bot_n, mais fonctionne seul test if v2<v1 avec limites scalaires. L'auteur de la fonction pensait à un simple intervalle de [3, 9], pas à votre 2d plus général.

Alors, oui, écrivez votre propre masque.