数値リストを文字リストに変換するにはどうすればよいですか?みなさん、こんにちは。
数値を含むリストがあり、それらを文字に変換したいと考えています。 ループを使用せずにそれを行う方法はありますか? 適切な関数を見つけることができませんでした。
ご協力いただきありがとうございます!
データのブレンディングとクリーンアップRe: 数値リストを文字リストに変換するにはどうすればよいですか?@donmcormackバニラの for ループは、問題のサイズに応じて、最も速いこともあれば、最も遅いこともあります。 わたしは本当驚いた@MS単語ベースのソリューションは、大きなサイズでも非常に優れたパフォーマンスを発揮します。 このような JMP の機能を紹介する予想外の回答がとても気に入っています。 ある程度のサイズでは、for-each の方が for よりも高速であることに少し驚きました。 私もそれを知るのが好きです。
私は何も避けようとはしません。 私は、明確な勝者が決まるというよりも、あなたの現在の議論の計画が好きです。 ディスカッションのきっかけとなるアイデアをいくつか紹介します。
- 変換する N 個のリストがあり、それらすべてに M 個の要素がある場合、N と M は作成するコードにどのような影響を与えるでしょうか? 速度だけでなく、正確性とメンテナンスのしやすさも考慮してください。
- メモリに制約のあるマシンにはどのアイデアが最適だと思われますか?
- 「.」ではなく「NaN」を表示するにはどうすればよいでしょうか?
- 汎用ルーチンはどのようなものになるでしょうか? JMP に組み込まれている場合は何と呼びますか?
Re: 数値リストを文字リストに変換するにはどうすればよいですか?Transform Each もありますが、これは For Each よりも少し速いようです。
theList = Transform Each( {value}, theList, Char( value ) );
Re: 数値リストを文字リストに変換するにはどうすればよいですか?ありがとう@Craige_Hales ! それはいいですね。 次のチャレンジに組み込めるかどうか見てみましょう。 反復を一切避けるべきか、それともただ単にために(およびその派生製品)?反復を回避する 1 つの方法は、式の評価を使用することです。 このアプローチに慣れていない場合は、次を確認してください@ジョセフ・モーガンさんの発見チュートリアル、ポイント 1 。 上記の問題の場合、関数は次のようになります。
convertNumberToCharacter = Function({inList},{i=1,outList={}},
outList[1::N Items(inList)] = Expr(Char(inList[i++]));
Eval List(outList);
);
/* You can check it out using the code below.
tStart = HP Time();
alist = As List(J(10000,1,Random Normal(1e6,1e5)));
newList = convertNumberToCharacter(alist);
Print((HP Time()-tStart)/1e6);
*/
私はいくつかのチャレンジでこれを試しましたが、簡潔ではありますが、時間がかかり、理解するのが難しくなる傾向があります (式の処理にかなり慣れている場合を除く)。
Re: 数値リストを文字リストに変換するにはどうすればよいですか?@donmcormack -チャレンジ!
Re: 数値リストを文字リストに変換するにはどうすればよいですか?うわー、1 つの解決策を探していたのに、たくさんの解決策が見つかりました。 JMPってすごいですね! 皆さんに感謝します!
Re: 数値リストを文字リストに変換するにはどうすればよいですか?さまざまな関数のサイズ依存のパフォーマンスを示す素晴らしい図です。 まだJMP 15を使用していますが、使用できませんそれぞれについて()まだですが、Jeff のタイミング演習をさらに拡張するために、同じ結果が得られるさらに 2 つの関数を追加します。
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

小さなリストでは最も高速な For ループは、サイズ > 50 では Words、サイズ > 1000 では data-table-detour 関数、サイズ > 30000 ではRepeat に上回ります。
サイズが 50 を超える場合でも Words が依然として最速であり、数百万の「単語」では約 2 倍速かったことに少し驚きました。
Re: 数値リストを文字リストに変換するにはどうすればよいですか?追加情報をありがとうございます@ジェフ・パーキンソンと@Craige_Hales !
私たちはコミュニティからいつもたくさんのことを学びます!!
Re: 数値リストを文字リストに変換するにはどうすればよいですか?ジェフの答えを拡張します
Different overheads hurt for small sizes and help for large sizes.Different overheads hurt for small sizes and help for large sizes.オーバーヘッドが異なると、サイズが小さい場合には問題が発生しますが、サイズが大きい場合には役立ちます。
dt = New Table( "Untitled 3",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "for", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "foreach", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "custom", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
For( listsize = 1, listsize < 1e7, listsize *= 2,
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
Show( foreachloop, customfunction, forloop );
dt << addrows( 1 );
dt:size[N Rows( dt )] = listsize;
dt:for[N Rows( dt )] = forloop / 1e6;
dt:foreach[N Rows( dt )] = foreachloop / 1e6;
dt:custom[N Rows( dt )] = customfunction / 1e6;
Wait( 0.1 ); // so it shows on display
);Re: 数値リストを文字リストに変換するにはどうすればよいですか?ここでは、for ループ、for each、およびデータ テーブルを使用したカスタム関数の 3 つのメソッドの簡単なタイミング プログラムを示します。
Names Default To Here( 1 );
listsize=1000000;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
show(foreachloop, customfunction, forloop);
上記のリストサイズを使用した場合、結果は 3 つの方法で非常に似ています。
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
Re: 数値リストを文字リストに変換するにはどうすればよいですか?ありがとう@ジェフ・パーキンソン!
各ソリューションの実行時間を比較するために、好奇心からいくつかのシミュレーションを行ったところ、各関数の実行時間が平均して最も速いようです。
だから私はそれを選ぶつもりですが、その機能は@txnelsonも非常にうまく機能します。
お二人に感謝します:)
Re: 数値リストを文字リストに変換するにはどうすればよいですか?JMP 16 の新機能は、 For Each() 関数コンテナー (リスト、行列、または連想配列) を反復処理して、各要素に対して操作を実行します。
これを使用して数値のリストを文字列のリストに変換する方法を示す例を次に示します。
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
Re: 数値リストを文字リストに変換するにはどうすればよいですか?ご回答有難うございます@txnelsonそれはまさに私が探していたものです。
ループとテーブル作成を伴う関数ではどちらが速いのでしょう。 何か案が?
Re: 数値リストを文字リストに変換するにはどうすればよいですか?ここに、必要なことを実行する関数を作成する小さなスクリプトがあります。コード内で関数を定義して使用することも、オープン コードで 4 つのステートメントを使用して変換を行うこともできます。
Names Default To Here( 1 );
theList = {7,8,9};
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
theList = NumListToChar( theList );