3D 좌표 데이터 그룹에 대한 기본 일치점 확인

개시하다


더 좋은 방법이 있나.한편으로는 모색하면서 한편으로는 잠시 이 방법으로 총결하였다.(더 좋은 방법을 아시는 분은 저에게 알려주세요!)→ 가르쳐주신 여러분 정말 감사합니다!개량판을 페이지의 하부에 추가하였다.

하고 싶은 일


①기본
다음 그림과 같이 동일한 좌표를 링크할 번호로 저장된 Excel이 3D 좌표 점으로 있습니다.다음 그림의 예에서 S/N-2의 좌표와 S/N-3의 좌표(파란색으로 돋보이는 곳)가 완전히 일치하기 때문에 이 좌표들은'동일한 좌표!'라고 판정했다.
② 적용
내가 이번에 처리한 대상의 규격으로서 완전히 좌표가 일치하기는 매우 어렵다.따라서 어느 정도의 Margin으로 일치 여부를 판단하길 바란다.예를 들어 S/N-8의 좌표와 S/N-9의 좌표(노란색으로 튀어나온 곳)는 대체적으로 일치하는데 이것도'동일한 좌표'로 판정하기를 바란다.

이번에 나는 이 응용의 좋은 생각을 생각하지 못했다.
완전히 일치하는 것만 추출할 때 X 좌표, Y 좌표, Z 좌표를 문자열로 결합시켜 일치 여부를 판단하면 된다.

이런 느낌.


우선 Margin을 포함하는 판정 가능한 함수를 만듭니다.다음 경우 오차 ±100이 무시되고 세 좌표에 margin이 포함되어 있으면 True가 반환됩니다.

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
이 함수를 사용하여 위에서 Excel 파일의 행을 읽습니다.
반복해서 읽지 않기 위해 두 번째 for구의 시작 번호에 공을 들였다.
df_test = pd.read_excel('sample.xlsx')

for i in range(len(df_test)):
    ax= df_test.loc[i,"X座標"]
    ay= df_test.loc[i,"Y座標"]
    az= df_test.loc[i,"Z座標"]
    k = i+1
    for j in range(k,len(df_test)):
        bx = df_test.loc[j,"X座標"]
        by = df_test.loc[j,"Y座標"]
        bz = df_test.loc[j,"Z座標"]
        if coordinates_check(ax,ay,az,bx,by,bz):
            print("一致しました:",df_test.loc[i,"S/N"],"-->",df_test.loc[j,"S/N"])
결국 잘했어.

아주 적은 데이터였으면 좋겠어요.


내가 이번에 사용하고 싶은 데이터가 1만 줄이 넘었는데 이 코드를 실행하려면 3시간 정도 걸리겠지...오늘 이맘때 더 좋은 방법이 있을 것 같아서요.좋은 방법을 아시는 분 도와주세요!

(2010/7/16 보충) 권장사항을 바탕으로 업데이트


채팅창에 협조해주신 여러분 정말 감사합니다!!
numby로 변환하여 ismatch 처리 후 약 2초 만에 완성됩니다.
무섭다.numpy..
(↓ 참조된 코드는 거의 복제된 것들입니다. 정말 감사합니다.)
import time
import numpy as np

margin = 100

data = df_all.loc[:, ["X座標", "Y座標", "Z座標"]].values

margin = 100

match_dict = {}

start = time.time()
for i in range(data.shape[0]):
    # Broadcast用にshapeを拡大する
    compared = np.expand_dims(data[i], 0) # shape = (1, 3)

    # np.abs(data[i+1:] - compared) < margin で各要素がmargin内に入っているか判定
    # np.all(axis=1)でx,y,z軸の論理積を取っている
    # 最終的なismatchはi+1番目からのshape=(10000 - i - 1)のBoolean型になる
    ismatch = np.all(np.abs(data[i+1:] - compared) < margin, axis=1) # shape = (10000 - i - 1,)

    # True=1,False=0と捉えられるので,nonzeroでTrueのIndexを取得
    # ismatchのIndexはi+1番目からなので + (i + 1)する
    match_dict[i] = np.nonzero(ismatch)[0] + i + 1
    #print(np.nonzero(ismatch)[0])


print(time.time() - start) # 2s
느낌 좋아!(Index=2는 Index3, 4와 일치)
numpy.난 노제로가 이런 행동을 할 줄 몰랐어...

좋은 웹페이지 즐겨찾기