for 루프 없이 리스트의 리스트 전치for 루프를 사용하지 않고 목록 목록을 바꾸는 방법을 갖고 싶습니다. 즉, 다음과 같이 목록 목록의 "행"과 "열"을 뒤집는 일부 함수(예를 들어 "Listtranspose"라고 함)입니다.
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
tranlist = Listtranspose(listlist);
Show(tranlist);
/*Result:
{{"cat", "meow"}, {"dog", "bark"}, {"mouse", "squeak}}
대체 구현은 다음과 같을 수 있습니다.
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
nr = NItems(listlist);
col1 = listlist[1::nr][1];
col2 = listlist[1::nr][2];
col3 = listlist[1::nr][3];
translist = EvalList({col1, col2, col3});
전체 목록이 아닌 "열"의 하위 집합만 바꿔야 할 수도 있으므로 후자의 구현이 더 좋습니다.
물론 이것은 For 루프를 사용하여 수행할 수 있지만 이렇게 요청하는 이유는 For 루프가 느릴 수 있기 때문입니다. 나는 큰 텍스트 블록으로 작업하며 이것이 나를 위해 작업 속도를 크게 높이는 데 도움이 될 것이라고 믿습니다.
크레딧 @vince_faller 원래 이것을 요구합니다.for 루프 없이 리스트의 리스트 전치
스크립팅Re: for 루프 없이 리스트의 리스트를 바꿉니다.이것에 대해 좀 더 생각해보세요.나는 여전히 for 루프를 이길 수 없지만 누군가에게 도움이 될 경우에 이것을 적어 둘 것이라고 생각했습니다.
// make a blank data table with the right shape
dt = As Table(J(nr, nc, .), <<PRIVATE></PRIVATE>
Re: for 루프 없이 리스트의 리스트를 바꿉니다.@Craige_Hales 엄청난 통찰력 Craig에 감사드립니다. for 루프 대 병렬 할당 방법의 속도 테스트를 수행했으며 병렬 할당이 훨씬 느렸습니다. 내 목록 배열은 718r x 14182c이므로 >10million 요소입니다. ~10분 동안 스크립트를 실행했지만 작업이 완료되지 않았습니다. 이것은 위의 데이터가 예측한 것보다 약간 느린 것 같지만 고려해야 할 변수가 너무 많습니다(예: 컴퓨터 시스템, 행에 대한 열의 비율?). For 루프는 동일한 테이블에 대해 ~10.1초로 훨씬 빠릅니다.
그래도 내가 원하는 것보다 느립니다. 내부적으로 이 작업을 수행할 수 있는 JMP 기능이 있으면 좋을 것입니다.
Re: for 루프 없이 리스트의 리스트를 바꿉니다.그러나 몇 가지 테스트를 거친 후 간단한 중첩 루프가 다른 JSL 기반 접근 방식보다 빠를 것이라고 생각합니다.
result = {};
for( c = 1, c <= nc, c += 1,
thisrow = {}; // build a row from a column
for( r = 1, r <= nr, r += 1,
thisrow[r] = testList[r][c];
);
result[c] = thisrow;
);@DonMcCormack - 도전!
The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.블루 라인 for-loop는 일관되게 더 좋습니다. 자주색 JSON 테이블이 이를 능가할 수 있지만 메모리가 부족합니다. 병렬 할당 트릭은 많은 수에 대해 실패하기 시작합니다.
병렬 할당은 아마도 항상 스레드를 서로 차단하고 있을 것입니다. 둘 사이의 오버헤드가 다르기 때문에 처음에는 json 데이터 테이블을 능가합니다.
Re: for 루프 없이 리스트의 리스트를 바꿉니다.예, 목록 조작 기능이 더 있으면 좋을 것입니다. 나는 좋은 방법이나 빠른 방법을 생각해낼 수 없지만, 조금 플레이한 후에 이것을 생각해 냈습니다. JMP 15가 필요하고 14에서 실패합니다.
list = {{"lion", "tiger", "puma"}, {"lamp", "torch", "pharos"}, {"lark", "toucan", "pigeon"}, {"lawn", "terrace", "patio"}};
jlist = As JSON Expr( list );
dt1 = JSON To Data Table( jlist, invisible(1) );
dt1 << New Column( "row", numeric, setvalues( 1 + Floor( (0 :: (N Rows( dt1 ) - 1)) / N Items( list[1] ) ) ) );
dt2 = dt1 << Split( Split By( :row ), Split( column(dt1,1) ), Sort by Column Property, invisible(1) );
Close( dt1, nosave );
transposed = dt2[0, 0];
Close( dt2, nosave );
Show( list, transposed );목록 = {{"사자", "호랑이", "퓨마"}, {"램프", "횃불", "파로스"}, {"종달새", "큰부리새", "비둘기"}, {"잔디", "테라스", "파티오"}};
transposed = {{"사자", "램프", "종달새", "잔디"}, {"호랑이", "횃불", "큰부리새", "테라스"}, {"퓨마", " 파로스 ", "비둘기", "안뜰"}};
중간 테이블 숨기기를 해제하여 수행 중인 작업을 확인합니다. 실제 솔루션은 길이가 다른 행을 처리해야 합니다.
Re: for 루프 없이 리스트의 리스트를 바꿉니다.@Craige_Hales 내가 정기적으로 사용하는 훌륭한 설명을 썼습니다.병렬 할당을 사용한 멀티스레딩 문제 해결
Re: for 루프 없이 리스트의 리스트를 바꿉니다.@vince_faller
마음 == 날려.
이전에 Parallel Assign 기능에 대해 들어본 적이 없습니다. 나는 이것을 시도했고 네, 작동합니다. 내가 문자열로 작업하고 있고 이것은 기술적으로 행렬 함수이지만 어떻게든 상관하지 않습니다. 이것을 가지고 놀면서 그것이 for 루프보다 더 빠른지 보는 것은 흥미로울 것입니다. 내가 알게되면 여기에서 업데이트하려고합니다.
아이디어 주셔서 감사합니다!
Re: for 루프 없이 리스트의 리스트를 바꿉니다.위아래로 맹세컨대 누군가가
{"cat", "dog", "mouse", "meow", "bark", "squeak"}[[1 1, 1 1]]
// and had it return
{{"cat", "cat"}, {"cat", "cat"}}
발견에서 이야기하는 동안 하지만 나는 그것을 다시 만들 수 없었습니다.모두 꿈이었을까요?
내 기억이 맞다면 그들은 어떻게든 그런 식으로 한 줄에 있는 플랫 목록에서 새 목록을 만들었습니다.아마 제대로 기억이 나지 않을 것입니다.
즉, 병렬 할당을 정말 빠르게 할 수 있다는 것입니다.
names default to here(1);
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
m = J(nc, nr, -1);
::trans_list = Aslist(m);
Parallel Assign({l = listlist},
m[a, b] = (
::trans_list[a][b] = l[b][a];
)
);
show(::trans_list);