벡터 엔트리 매칭 문제
Sep 17 2020
벡터로 구성된 목록이 있습니다. 각각에 5 개의 항목이 있다고 가정 해 보겠습니다. 목록은 모든 차원을 가질 수 있습니다.
file =
{{1, 0, -1, 1, 0}, {-1, 0, -1, 0, 0}, {1, 0, 1, 0, 0}, {1, 0, -1, 0, 1},
{1, 0, -1, 1, 0}, {-1, 0, 1, 0, 0}, {1, 0, 1, 0, 0}, {1, 0, 0, 0, 0},
{0, 0, 1, 0, 0}, {1, 0, 1, 1, 0}};
각 벡터의 처음 세 구성 요소는 {-1, 0, 1} 집합에 있습니다. 4 번째와 5 번째는 0 또는 1입니다.
모든 벡터의 4 번째 항목과 5 번째 항목을 추가하고 싶습니다. 처음 3 개 항목은 동일합니다.
나는 사용하여 처음 세 항목을 비교하지만 HammingDistance; 같은 것
If[Length[file] != 0,
DeleteCases[
Flatten[
Table[
If[
i != j &&
HammingDistance[Drop[file[[i]], -2], Drop[file[[j]], -2]] ==0,
{file[[i]][[1]], file[[i]][[2]],file[[i]][[3]],file[[i]][[4]], file[[i]][[5]]},
0],
{i, 1, Length[file]}, {j,1, i}],
1],
0],
0]
그러나 이것은 패턴이 두 번 이상 발견되는 벡터 만 선택합니다. 처음 세 항목이 동일한 모든 벡터를 일치시키고 어수선하게 만드는 방법에 대한 아이디어가 있습니까?
답변
3 Bill Sep 17 2020 at 18:37
이 시도.
file={{1,0,-1,1,0},{-1,0,-1,0,0},{1,0,1,0,0},{1,0,-1,0,1},{1,0,-1,1,0},{-1,0,1,0,0},
{1,0,1,0,0},{1,0,0,0,0},{0,0,1,0,0},{1,0,1,1,0}};
grouped=Split[Sort[file],Take[#1,3]==Take[#2,3]&]
Map[Join[Take[#[[1]],3],Drop[Total[#],3]]&,grouped]
표시하는
{{{-1,0,-1,0,0}},{{-1,0,1,0,0}},{{0,0,1,0,0}},{{1,0,-1,0,1},{1,0,-1,1,0},
{1,0,-1,1,0}},{{1,0,0,0,0}},{{1,0,1,0,0},{1,0,1,0,0},{1,0,1,1,0}}}
처음 세 개의 공통 요소로 벡터를 그룹화하는 방법을 보여줍니다.
그리고
{{-1,0,-1,0,0},{-1,0,1,0,0},{0,0,1,0,0},{1,0,-1,2,1},{1,0,0,0,0},{1,0,1,1,0}}
각 그룹의 마지막 두 요소의 합계를 보여줍니다.
3 kglr Sep 17 2020 at 20:28
KeyValueMap[Join] @ GroupBy[file, (Take[#, 3] &) -> (Drop[#, 3] &), Total]
{{1, 0, -1, 2, 1}, {-1, 0, -1, 0, 0}, {1, 0, 1, 1, 0}, {-1, 0, 1, 0, 0}, {1, 0, 0, 0, 0}, {0, 0, 1, 0, 0}}
또는
KeyValueMap[Join] @ Merge[Total] @ Map[Association[Rule @@ TakeDrop[#, 3]] &] @ file
{{1, 0, -1, 2, 1}, {-1, 0, -1, 0, 0}, {1, 0, 1, 1, 0}, {-1, 0, 1, 0, 0}, {1, 0, 0, 0, 0}, {0, 0, 1, 0, 0}}