Vấn đề đối sánh mục nhập vectơ
Tôi có một danh sách được tạo bởi các vectơ. Giả sử với năm mục trong mỗi mục. Danh sách có thể có bất kỳ thứ nguyên nào.
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}};
Ba thành phần đầu tiên của mỗi vectơ nằm trong tập {-1, 0, 1}. Số 4 và 5 là 0 hoặc 1.
Tôi muốn thêm mục thứ 4 và thứ 5 trong tất cả các vectơ giống hệt nhau trong ba mục đầu tiên.
Tôi mặc dù để so sánh ba mục đầu tiên bằng cách sử dụng HammingDistance; cái gì đó như
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]
nhưng điều này chỉ chọn các vectơ trong đó mẫu được tìm thấy nhiều hơn một lần. Bất kỳ ý tưởng nào về cách đối sánh và lộn xộn tất cả các vectơ có cùng 3 mục nhập đầu tiên?
Trả lời
Thử cái này.
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]
cái nào hiển thị
{{{-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}}}
hiển thị cách nó nhóm các vectơ với ba phần tử đầu tiên chung
và sau đó
{{-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}}
hiển thị cách nó tổng cộng hai phần tử cuối cùng trong mỗi nhóm.
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}}
hoặc là
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}}