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이므로 요소가 천만 개가 넘습니다. ~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;
);@돈맥코맥 - 도전!
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.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 루프가 지속적으로 더 좋습니다. 보라색 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 );list = {{"사자", "호랑이", "푸마"}, {"램프", "횃불", "pharos"}, {"종달새", "큰부리새", "비둘기"}, {"잔디", "테라스", "파티오"}};
transposed = {{"사자", "램프", "종달새", "잔디"}, {"호랑이", "횃불", "큰부리새", "테라스"}, {"푸마", " 파로스 ", "비둘기", "파티오"}};
중간 테이블의 숨기기를 해제하여 수행 중인 작업을 확인합니다. 실제 솔루션은 길이가 다른 행을 처리해야 합니다.
Re: for 루프 없이 목록의 목록을 전치합니다.@Craige_Hales 내가 정기적으로 사용하는 훌륭한 설명을 작성했습니다.병렬 할당을 사용한 다중 스레딩 문제 해결
Re: for 루프 없이 목록의 목록을 전치합니다.@vince_faller
마음 == 날아갔습니다.
이전에는 병렬 할당 기능에 대해 들어본 적이 없습니다. 나는 이것을 시도했고, 네, 작동합니다. 비록 문자열을 가지고 작업하고 있고 이것은 기술적으로는 행렬 함수이지만 어쨌든 상관하지 않습니다. 이것을 가지고 놀면서 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);