[PYTHON] Vérifiez s'il existe des points "presque correspondants" pour le groupe de données de coordonnées 3D.

introduction

En cherchant un meilleur moyen .., je vais le résumer ainsi pour le moment. ** (Si vous connaissez un meilleur moyen, faites-le moi savoir !!) **

Chose que tu veux faire

① Basique Comme le montre la figure ci-dessous, il existe Excel qui stocke des points de coordonnées en trois dimensions et je souhaite lier des nombres avec les mêmes coordonnées. Dans l'exemple ci-dessous, les coordonnées de S / N-2 et les coordonnées de S / N-3 (surlignées en bleu clair) sont exactement les mêmes, elles sont donc considérées comme «les mêmes coordonnées!».

② Application En tant que spécification de la cible sur laquelle je travaille cette fois, il est difficile que les coordonnées correspondent exactement. Par conséquent, je voudrais juger qu'ils correspondent à un certain montant de marge. Par exemple, les coordonnées de S / N-8 et les coordonnées de S / N-9 (surlignées en jaune) correspondent ** presque **, alors veuillez juger qu'il s'agit également des «mêmes coordonnées».

image.png

Cette fois, je ne pouvais pas penser à une autre bonne idée pour cette "application". .. Si vous souhaitez extraire uniquement la correspondance exacte, j'ai pensé que vous devriez combiner la coordonnée X, la coordonnée Y et la coordonnée Z en tant que chaîne de caractères et juger si elles correspondent.

Le code résultant ressemble à ceci

Tout d'abord, créez une fonction qui peut être jugée, y compris la marge. Dans les cas suivants, l'erreur ± 100 est ignorée et True est renvoyé si les trois coordonnées correspondent, y compris la marge.


def coordinates_check(ax,ay,az,bx,by,bz):
    margin=100
    flag = 0
    result=False
    
    if ax-margin < bx < ax+margin:
        flag = flag +1
    if ay-margin < by < ay+margin:
        flag = flag +1
    if az-margin < bz < az+margin:
        flag = flag +1
        
    if flag >2:
        result = True

    return result

Utilisez cette fonction pour lire les lignes du fichier Excel ci-dessus. Le numéro de début de la seconde instruction for est conçu de telle sorte que les lectures ne soient pas dupliquées.

df_test = pd.read_excel('sample.xlsx')

for i in range(len(df_test)):
    ax= df_test.loc[i,"Coordonnée X"]
    ay= df_test.loc[i,"Coordonnée Y"]
    az= df_test.loc[i,"Coordonnée Z"]
    k = i+1
    for j in range(k,len(df_test)):
        bx = df_test.loc[j,"Coordonnée X"]
        by = df_test.loc[j,"Coordonnée Y"]
        bz = df_test.loc[j,"Coordonnée Z"]
        if coordinates_check(ax,ay,az,bx,by,bz):
            print("Matched:",df_test.loc[i,"S/N"],"-->",df_test.loc[j,"S/N"])

En conséquence, c'est bien fait. image.png

J'aimerais avoir une petite quantité de données.

Les données que je souhaite utiliser cette fois-ci représentent plus de 10000 lignes et l'exécution du code ci-dessus a pris ** environ 3 heures ** ... C'est à cette époque que j'ai pensé qu'il devrait y avoir un meilleur moyen. Si vous connaissez un bon moyen, veuillez aider!

Recommended Posts

Vérifiez s'il existe des points "presque correspondants" pour le groupe de données de coordonnées 3D.
Vérifiez si les caractères sont similaires en Python
Déterminer s'il y a des oiseaux dans l'image