거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법은 무엇입니까?웨이퍼에서 두 세트의 측정에 대한 두 개의 데이터 테이블이 있습니다. 각 테이블에는 측정 위치를 나타내는 X, Y의 4개 열과 각 테이블에 대한 측정 데이터의 2개 열이 있습니다. 측정은 웨이퍼의 정확히 동일한 위치(X, Y)에서 수집되지 않습니다. 측정 위치의 근접성에 따라 두 테이블 중 하나를 업데이트(다른 테이블의 추가 열 추가)하고 싶습니다. 더 명확하게 말하면, X1, Y1을 X2와 Y2의 가장 가까운 지점에 일치시키는 것에 따라 결합된 테이블(총 8개 열)을 원합니다. 제가 업로드한 그림을 참조하세요. Distance 함수를 사용하면 주어진 X, Y로부터의 모든 거리의 행렬을 만들 수 있다는 것은 알고 있지만 업데이트된 테이블을 계산하는 jsl 코드를 작성하는 방법을 잘 모르겠습니다.
자동화 및 스크립팅데이터 블렌딩 및 정리윈도우Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법Distance 외에 다음 기능을 확인해보세요.
그런 다음 "기본" 테이블에 행 기반 인덱스를 추가하고 이 중 하나를 사용하여 가장 가까운 인덱스(기본적으로 행)를 찾은 다음 두 번째 테이블에 추가한 후 마지막으로 업데이트/조인을 사용하여 테이블을 결합합니다.
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법@jthi 링크를 기반으로 이것이 당신이 원하는 것을 수행할 수 있다고 믿습니다.
dt1=New Table( "Table 1",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
dt2=New Table( "Table 2",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Display Width( 120 )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Selected,
Set Display Width( 118 )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
M1 = dt1 << GetAsMatrix();
MD1=vptree(M1);
M2 = dt2 << GetAsMatrix();
MD2=kdtable(M2);
//returns the nearest point of Table 1 to a point in table 2
//to reverse the look up, make MD1-> MD2 and M2->M1
{rows, dist} = MD1 << K nearest rows( 1, M2);
dt1<<NEW column=""></NEW>Steve
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법안녕하세요 Steve, 그리고 Jarmo,
제안해 주셔서 감사합니다. 스크립트도 유용했습니다. 하지만 실행해 보면 가장 가까운 거리를 찾지 못하는 것 같습니다. 예를 들어, 표 1의 첫 번째 행은 표 2의 행 8(거리 ~1.37)과 일치하지만 행 번호 1(거리 0.69)과 같이 훨씬 더 가까운 점이 많이 있습니다(거리를 sqrt[(x-x0)^2+(y-y0)^2]로 두세요)

Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법스크립트 끝부분의 데이터 테이블을 섞은 것 같습니다. 다음을 시도해 보세요.
dt1=New Table( "Table 1",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
wait(0.0);
dt1:x << suppress eval( true );
dt1:y << suppress eval( true );
dt2=New Table( "Table 2",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Display Width( 120 )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Selected,
Set Display Width( 118 )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
wait(0.0);
dt2:x << suppress eval( true );
dt2:y << suppress eval( true );
M1 = dt1 << GetAsMatrix();
MD1=vptree(M1);
M2 = dt2 << GetAsMatrix();
MD2=kdtable(M2);
//returns the nearest point of Table 1 to a point in table 2
//to reverse the look up, make MD1-> MD2 and M2->M1
{rows, dist} = MD1 << K nearest rows( 1, M2);
dt2<<NEW column=""></NEW>I virtual linked them and did some visual checks so I believe we are good now
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/67225i8663690D9A1ED800/shampton82_0-1724013813741.png" role="button" title="shampton82_0-1724013813741.png" alt="shampton82_0-1724013813741.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법I still see it is not picking up the closest points: <BR />Names Default To Here( 1 );
Close All(data tables);
Clear Log();
Clear Symbols();
dt1= Open(
"C:\Users\Table 1.jmp");
wait(0.0);
dt1:X1 << suppress eval( true );
dt1:Y1 << suppress eval( true );
dt2= Open(
"C:\Users\Table 2.jmp");
wait(0.0);
dt2:X2 << suppress eval( true );
dt2:Y2 << suppress eval( true );
M1 = dt1 << GetAsMatrix();
MD1=vptree(M1);
M2 = dt2 << GetAsMatrix();
MD2=kdtable(M2);
//returns the nearest point of Table 1 to a point in table 2
//to reverse the look up, make MD1-> MD2 and M2->M1
{rows, dist} = MD1 << K nearest rows( 1, M2);
dt1<<NEW column=""></NEW>Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법dt1=New Table( "Table 1",
Add Rows( 20 ),
New Column( "x",
Formula( Random Uniform(0,10) )
),
New Column( "y",
Formula( Random Uniform(0,10) )
)
);
dt2=New Table( "Table 2",
Add Rows( 64 ),
New Column( "x2",
Formula( floor(row()/8)+1 )
),
New Column( "y2",
Formula( mod(row(),8)+1 )
)
);
// M2 = dt2 << GetAsMatrix();
// better - see below
M2 = dt2[0, {"x2", "y2"}];
MD2=kdtable(M2);
dt1 << New Column( "row_orig",Nominal, Formula( Row() ));
dt2 << New Column( "row_2",Nominal,Formula( Row() ));
dt1 << New Column( "table",Nominal, set each value(1));
dt2 << New Column( "table",Nominal, set each value(2));
wait(0);
// step by step, for each row in dt1, use MD2 to find the closest position in dt2
dt1 << new column("row_2",Nominal, set each value(
pos = Matrix({:x, :y});
(MD2 << K nearest rows( 1, pos))[1][1]));
// concatenate the tables to generate a combined plot
dt2:x2 << set name("x");
dt2:y2 << set name("y");
check = dt1 << Concatenate(dt2);
check << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :x ), Y( :y ), Overlay( :row_2 ), Color( :table ) ),
Elements(
Line( X, Y, Row order( 1 ) ),
Points( X, Y, Overlay( 0 ), Legend( 2 ) )
),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model(
2,
Properties( 0, {Marker( "FilledSquare" )}, Item ID( "1", 1 ) ),
Properties( 1, {Marker( "Circle" )}, Item ID( "2", 1 ) )
)}
)
)
);

Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법@hogi 님 , 이걸 정리해 주셔서 고맙습니다!
질문입니다. 이 코드 줄이 무엇을 하는지 설명해 주시겠습니까?
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));
감사하다!
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법고마워요 호기님,
이것은 매우 훌륭하게 실행되지만, 저는 Steve와 똑같은 질문을 했습니다.
라인을 설명해줄 수 있나요?
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));또한, 제 버전(테이블 1과 (x2, y2, data 3, data 4)에서 4개의 열(x, y, data 1, data 2)이 있는 테이블을 읽을 때)을 실행하면 아래 경고가 표시됩니다. 테이블 1과 테이블 2에 행렬에 없는 두 개 이상의 열(x, y)이 있기 때문에 화가 난 것 같습니다. 하지만 줄을 설명하면 나머지는 알아낼 수 있을 것 같습니다! 도와주셔서 감사합니다.

Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법안녕하세요 @spinup
문제는 제 코드가 테이블에 x와 Y 값만 있다고 가정했기 때문이라고 생각합니다. 숫자 열이 추가된 테이블로 시작하면 k 최근접 이웃은 X, Y, A, B 대 X, Y, C, D에 대한 가장 가까운 지점을 찾으려고 합니다.
@hogi 코드가 X와 Y만 고려한다면 잘 작동하는 이유가 바로 이거라고 생각해요.
X/Y가 아닌 열을 문자로 만들고 두 번째 코드를 실행하면 작동할 것입니다. 열을 결합한 후 다시 숫자로 변경하기만 하면 됩니다.
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법내가 보통 얻는 건 이런 식이에요.
Names Default To Here(1);
dt1 = New Table("Table 1",
Add Rows(20),
New Column("x", Numeric, "Continuous", Formula(Random Normal())),
New Column("y", Numeric, "Continuous", Formula(Random Normal()))
);
dt2 = New Table("Table 2",
Add Rows(20),
New Column("x", Numeric, "Continuous", Formula(Random Normal())),
New Column("y", Numeric, "Continuous", Formula(Random Normal())),
New Column("Val", Numeric, Continuous, Formula(Random Normal(2, 100)))
);
m1 = dt1[0, {"x", "y"}];
m2 = dt2[0, {"x", "y"}];
tree = VPTree(m2);
{rows, distances} = tree << K Nearest Rows(1, m1);
dt1 << New Column("Nearest", Numeric, Ordinal, Values(rows));
dt1 << New Column("Distance", Numeric, Ordinal, Values(distances));
dt2 << New Column("Row", Numeric, Ordinal, Values(1::N Rows(dt2)));
/* Depending on the wanted result, using Update might be better */
dt_result = dt1 << Join(
With(dt2),
By Matching Columns(:Nearest = :Row),
Drop multiples(0, 0),
Include Nonmatches(0, 0),
Preserve main table order(1),
Output Table("Result")
);
/*
Close(dt1, no save);
Close(dt2, no save);
*/
결과를 확인하지 않았기 때문에 가장 가까운 행에 대한 Join/K가 잘못된 방향으로 수행되었을 수 있습니다.
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법좌표가 있는 행렬을 얻으려면 Jarmo가 그의 예에서 한 것처럼 데이터 테이블 서브스크립팅을 사용할 수 있습니다.
행 = 0 -> 모든 행
열: x 및 y
coordinates as matrix = dt1[0, {"x", "y"}];Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법VPTree 의 문서가 최적화될 수 있습니다.
KD 테이블:

KDTable << K 최근접 행에는 두 가지 모드가 있습니다:
- 기본값: 입력 위치를 시작점으로 사용합니다.
-> 우리에게 적합하지 않습니다.
- 선택 사항: 단일 위치를 시작점으로 사용합니다.
-> 네!
나는 이 지점을 각 행에 대해 pos = Matrix({:x,:y}) 로 계산하고 이를 가장 가까운 K 행 에 대한 두 번째 인수로 제공합니다.
반환 값은 행 과 거리의 벡터입니다. [1][1] 을 사용하면 먼저 행을 가져온 다음 첫 번째(유일한) 항목을 가져올 수 있습니다.
불행히도 시작점을 입력으로 제공하는 모드는 없습니다.
VPTree:
K 최근접 행의 경우 Scripting INdex에 실제 설명이 없지만 VPTree 정의에 바로 예가 있습니다.

온라인 도움말에 몇 가지 설명서가 있습니다:


KDTable의 경우와 동일한 2가지 옵션인 것 같습니다.
@jthi 의 예에서 볼 수 있듯이 VPTree는 세 번째 모드를 허용하는데, 여기서는 일련의 위치가 행렬로 제공됩니다.
좀 놀랍긴 한데 매우 편리합니다:)
tree = VPTree(m2);
{rows, distances} = tree << K Nearest Rows(1, m1);
dt1 << New Column("Nearest", Numeric, Ordinal, Values(rows));
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법VPtree << K Nearest Rows(1, matrix of coordinates);
멋진 : ):)
Re: 거리를 기준으로 한 테이블의 데이터를 다른 테이블에 추가하는 방법추가 아이디어:
- 1D에 대한 관련 요구 사항: 정확히 일치하지 않는 열에 대한 퍼지 조인/ASOF 병합/조인 추가
더 높은 차원을 고려하라는 의견을 추가했습니다.
- 실제 적용 사례에서는 lot, wafer, variants와 같은 추가적인 명목 좌표가 있습니다. 사용자는 그에 따라 데이터를 분할하고 각 "variant"에 대해 별도의 VPTrees를 설정해야 합니다. groupBy 가 있는 VPTree가 논리적인 다음 단계가 될 것입니다.
- 반면에, 사용자는 이웃 값을 사용하는 대신, 더 의미 있는 값을 얻기 위해 입력 데이터를 보간하는 것을 선호할 수 있습니다. 그룹화 - 너무 유용해요!!! 보간은 어떨까요?