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.난 노제로가 이런 행동을 할 줄 몰랐어...
Reference
이 문제에 관하여(3D 좌표 데이터 그룹에 대한 기본 일치점 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/NGOhiroshi/items/53704a2aa4d2d14ca964
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
①기본
다음 그림과 같이 동일한 좌표를 링크할 번호로 저장된 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.난 노제로가 이런 행동을 할 줄 몰랐어...
Reference
이 문제에 관하여(3D 좌표 데이터 그룹에 대한 기본 일치점 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/NGOhiroshi/items/53704a2aa4d2d14ca964
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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.난 노제로가 이런 행동을 할 줄 몰랐어...
Reference
이 문제에 관하여(3D 좌표 데이터 그룹에 대한 기본 일치점 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/NGOhiroshi/items/53704a2aa4d2d14ca964
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
Reference
이 문제에 관하여(3D 좌표 데이터 그룹에 대한 기본 일치점 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/NGOhiroshi/items/53704a2aa4d2d14ca964텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)