シーケンス/イテレータ/ジェネレータで反復可能なローリングウィンドウ(別名スライディングウィンドウ)が必要です。デフォルトのPython反復は、ウィンドウの長さが1である特別な場合と考えることができます。現在、次のコードを使用しています。誰かがこれを行うためのよりPythonic、冗長ではない、またはより効率的な方法を持っていますか? def rolling_window(seq, window_size): it = iter(seq) win = [it.next() for cnt in xrange(window_size)] # First window yield win for e in it: # Subsequent windows win[:-1] = win[1:] win[-1] = e yield win if __name__=="__main__": for w in rolling_window(xrange(6), 3): print w """Example output: [0, 1, 2] [1, 2, …
ユーザーがPandas DataFrameまたはSeriesオブジェクトにいくつかのフィルターを適用したいというシナリオがあります。基本的に、実行時にユーザーが指定した一連のフィルタリング(比較操作)を効率的にチェーン化したいと考えています。 フィルターは付加的である必要があります(別名を適用すると結果が絞り込まれます)。 私は現在使用してreindex()いますが、これにより毎回新しいオブジェクトが作成され、基になるデータがコピーされます(ドキュメントを正しく理解している場合)。そのため、大きなSeriesまたはDataFrameをフィルタリングする場合、これは非常に非効率的です。 私が使用していることを考えているapply()、map()または類似した何かが良いかもしれません。私はパンダにかなり慣れていないので、すべてに頭を包み込もうとしています。 TL; DR 次の形式のディクショナリを取得して、各操作を特定のSeriesオブジェクトに適用し、「フィルター処理された」Seriesオブジェクトを返します。 relops = {'>=': [1], '<=': [1]} 長い例 私が現在持っているものの例から始めて、単一のSeriesオブジェクトをフィルタリングするだけです。以下は私が現在使用している関数です: def apply_relops(series, relops): """ Pass dictionary of relational operators to perform on given series object """ for op, vals in relops.iteritems(): op_func = ops[op] for val in vals: filtered = op_func(series, val) series = …
たとえば、私はリストがあります: a[0] = [1, 1, 1, 0, 0] a[1] = [1, 1, 0, 0, 1] a[2] = [0, 1, 1, 1, 0] # and so on それらは異なっているように見えますが、開始と終了が接続されていると想定されている場合、それらは循環的に同一です。 問題は、私が持っている各リストの長さが55で、1つが3つ、0が52個しかないことです。循環条件がない場合、26,235(55選択3)リストがあります。ただし、「循環」という条件が存在する場合、循環的に同一のリストが多数あります。 現在、私は次のように循環的にアイデンティティをチェックしています: def is_dup(a, b): for i in range(len(a)): if a == list(numpy.roll(b, i)): # shift b circularly by i return True return …
C ++ 0xは、他の多くの場所でunordered_set利用可能なものを導入していますboost。私が理解しているのunordered_setは、O(1)ルックアップが複雑なハッシュテーブルです。一方、ルックアップが複雑なsetツリーにすぎませんlog(n)。なぜ誰もがset代わりに使うのunordered_setでしょうか?すなわち、setもはや必要性はありますか?