Salut toutes mes excuses si le titre prête à confusion, je suis novice en numpy et je ne suis pas habitué à la terminologie.

Supposons que nous ayons un tableau numpy agissant comme une carte du monde. Les paramètres sont (x y r g b) - tous sont int16

Exemple:

a = np.array([[  0,   0,   0, 255,   0], #index 0
              [  0,   1,   0,   0, 255], #index 1
              [  0,   2,   0, 255,   0]]) #index 2

Maintenant, nous voulons trouver la valeur d'index de la ligne avec les valeurs x et y (0, 2) - d'où la ligne avec l'index 2.

[  0,   1,   0,   0, 255] #index 2

Comment pourrais-je faire cela sans entrer également le reste des valeurs (r g b)? Fondamentalement, nous recherchons une ligne de cinq valeurs avec deux valeurs - comment pourrais-je faire cela?

0
Tom 17 mars 2019 à 17:05

2 réponses

Meilleure réponse

Voici vos données:

import numpy as np

arr = np.array([[  0,   0,   0, 255,   0],
              [  0,   1,   0,   0, 255],
              [  0,   2,   0, 255,   0]])

a,b = 0,2 # [a,b] is what we are looking for, in the first two cols

Voici la solution pour obtenir l'index de ligne contenant [a, b]:

found_index = np.argmax(np.logical_and(arr[:,0]==[a],arr[:,1]==[b]))
print (found_index)

Sortie:

2

Explication:

La meilleure façon de comprendre comment cela fonctionne est d'imprimer chaque partie:

print (arr[:,0]==[a])

Les sorties:

[Vrai Vrai Vrai]

print (arr[:,1]==[b])

Les sorties:

[Faux Faux Vrai]

print (np.logical_and(arr[:,0]==[a],arr[:,1]==[b]))
# print (np.logical_and([ True  True  True], [False False  True]))

Les sorties:

[Faux Faux Vrai]

0
fountainhead 17 mars 2019 à 17:49

Vous pouvez découper les lignes jusqu'à la deuxième colonne et vérifier si elles sont égales à [0,2]. Ensuite, utilisez all définir axis sur 1 pour définir sur True ceux qui satisfont à toutes les conditions, et utiliser le tableau booléen pour indexer le ndarray :

a = np.array([[  0,   0,   0, 255,   0],
              [  0,   1,   0,   0, 255],
              [  0,   2,   0, 255,   0]])

a[(a[:,:2] == [0,2]).all(1)]
# array([[  0,   2,   0, 255,   0]])
1
yatu 17 mars 2019 à 14:14