Remplacer tous les éléments de Python Tableau NumPy qui sont supérieures à la valeur
J'ai un 2D tableau NumPy et à remplacer toutes les valeurs supérieures ou égales à un seuil T avec 255.0. À ma connaissance, le moyen le plus fondamental serait:
shape = arr.shape
result = np.zeros(shape)
for x in range(0, shape[0]):
for y in range(0, shape[1]):
if arr[x, y] >= T:
result[x, y] = 255
-
Ce qui est le plus concis et pythonic façon de le faire?
-
Est-il plus rapide (peut-être moins, concis et/ou moins pythonic) façon de le faire?
Ce sera une partie d'une fenêtre de réglage du niveau de sous-routine pour les examens par IRM de la tête humaine. La 2D tableau numpy est le pixel de l'image des données.
- Pour plus d'informations, jetez un coup d'oeil à cette intro à l'indexation.
Vous devez vous connecter pour publier un commentaire.
Je pense qu'à la fois la plus rapide et la plus concise façon de le faire est d'utiliser NumPy intégré dans la Fantaisie de l'indexation. Si vous avez un
ndarray
nomméarr
, vous pouvez remplacer tous les éléments>255
avec une valeurx
comme suit:J'ai couru ce sur ma machine avec un 500 x 500 matrice aléatoire, le remplacement de toutes les valeurs >de 0,5 à 5, et il a fallu une moyenne de 7.59 ms.
arr
, au lieu de créer unresult
tableau comme dans l'OP.A
mais la création d'un nouveau tableau?np.array([1,2,3]
)Puisque vous voulez vraiment un autre tableau qui est
arr
oùarr < 255
, et255
sinon, cela peut être fait simplement:Plus généralement, pour l'une inférieure et/ou supérieure lié:
Si vous voulez juste pour accéder aux valeurs supérieures à 255, ou quelque chose de plus compliqué, @mtitan8 la réponse est plus général, mais
np.clip
etnp.minimum
(ounp.maximum
) sont plus agréable et beaucoup plus rapide pour votre cas:Si vous voulez le faire sur place (c'est à dire, de modifier
arr
au lieu de créerresult
), vous pouvez utiliser leout
paramètre denp.minimum
:ou
(le
out=
nom est facultatif puisque les arguments dans le même ordre que la définition de la fonction.)En cours de modification, le booléen indexation des vitesses beaucoup (sans avoir à faire, puis modifier la copie séparément), mais n'est pas encore aussi rapide que
minimum
:À des fins de comparaison, si vous souhaitez limiter vos valeurs avec un minimum ainsi qu'un maximum, sans
clip
vous devez le faire deux fois, avec quelque chose commeou,
a[start:stop:step]
vous donne les éléments de la matrice destart
àstop
, mais à la place de chaque élément, il faut que tous lesstep
(si elle est négligée, il est1
par défaut). Afin de définir toutes les evens à zéro, vous pourriez fairea[::2] = 0
Je pense que vous pouvez réaliser cela le plus rapidement à l'aide de la
where
fonction:Par exemple à la recherche pour les articles de plus de 0,2 dans un tableau numpy et le remplacement de ceux qui ont 0:
Vous pouvez envisager d'utiliser des numpy.putmask:
Voici une comparaison de performances avec le Numpy est builtin indexation:
Une autre façon est d'utiliser des
np.place
qui fait à l'endroit de remplacement et travaille avec multidimentional tableaux:Vous pouvez également utiliser
&
,|
(et/ou) pour plus de flexibilité:des valeurs entre 5 et 10:
A[(A>5)&(A<10)]
des valeurs supérieures à 10 ou plus petit que 5:
A[(A<5)|(A>10)]