次のような秒単位の時間のリストがあります。 L = [0.10218048、1.20851996、1.46800021、1.73429061、2.71525848、 3.14781922、3.63637958、5.11147358、5.97497864、6.35469013、 6.80623747、6.99571917、7.65215123、7.86108352、8.52988247、 8.83068894、10.07690977、11.53867284、12.01214112、12.13307653] 2番目の境界から始まる長さ2秒の各ウィンドウについて、2秒のウィンドウ内にあるすべての時間のリストを出力したいと思います。したがって、上記の例では、次のようになります。 [0.10218048、1.20851996、1.46800021、1.73429061] [1.20851996、1.46800021、1.73429061、2.71525848] [2.71525848、3.14781922、3.63637958] [3.14781922、3.63637958] [5.11147358、5.97497864] [5.11147358、5.97497864、6.35469013、6.80623747、6.99571917] [6.35469013、6.80623747、6.99571917、7.65215123、7.86108352] [7.65215123、7.86108352、8.52988247、8.83068894] [8.52988247、8.83068894] [10.07690977] [10.07690977、11.5386728] [11.5386728、12.01214112、12.13307653] [12.01214112、12.13307653] 一般に、ウィンドウの長さは2とは異なる場合があります。 どうすればこれを行うことができますか?
2021-01-31 08:11:30
「2番目の境界から始まる2秒の長さのウィンドウごとに」に基づいて増分を意味し、重複しないことを意味したと思います。 2秒間隔の場合は同じですが、長さを変更するため、1秒のオーバーラップは0-3、2-5、4-7になりますが、増分は0-3、1-4、2-を意味します5.5。しかし、万が一に備えて両方の解決策を見つけるのは興味深いことでした。 Lがソートされ、すべての要素が正であり、2番目の区間がすべて整数で始まると仮定すると、次の方法を使用できます。 数学をインポートする コレクションからimportdefaultdict L = [0.10218048、1.20851996、1.46800021、1.73429061、2.71525848、 3.14781922、3.63637958、5.11147358、5.97497864、6.35469013、 6.80623747、6.99571917、7.65215123、7.86108352、8.52988247、 8.83068894、10.07690977、11.53867284、12.01214112、12.13307653] my_ranges = defaultdict(list) interval_width = 2 Lのxの場合: 上界と下界= math.ceil(x) lower_bound = upper_bound-interval_width lower_bound = max(0、lower_bound) 範囲内のyの場合(lower_bound、upper_bound): my_ranges [y] .append(x) ソート済み(my_ranges)の場合: print(my_ranges [a]) 空の範囲があるかどうかを確認したいかどうかはわかりません。ただし、defaultdictは、必要に応じて空の範囲も出力します。 「ソート済みの場合」の代わりに次の行を使用します。 範囲内の場合(min(my_ranges)、max(my_ranges)+ 1): 0〜3、2〜5、4〜7の範囲が必要な場合、これは機能します。 数学をインポートする コレクションからimportdefaultdict L = [0.10218048、1.20851996、1.46800021、1.73429061、2.71525848、 3.14781922、3.63637958、5.11147358、5.97497864、6.35469013、 6.80623747、6.99571917、7.65215123、7.86108352、8.52988247、 8.83068894、10.07690977、11.53867284、12.01214112、12.13307653] interval_width = 2 my_ranges_2 = defaultdict(list) Lのxの場合: 間違いなく_in =(x //(interval_width-1))*(interval_width-1)#xより下のinterval_widthの最小公倍数は常に #print( "追加"、x、 "to"、definitely_in) my_ranges_2 [definitely_in] .append(x) if x= 0:#たとえば、xが2.3で、0,3 2,5などがある場合、この重複するケースをキャッチする必要があります。ウィンドウの長さは整数であると想定していますが、そうでない場合は、数値が複数の配列に含まれる可能性があるため、やるべきことがたくさんあります。おそらく、whileループを作成して、(interval_width-1)ずつインクリメントすることができます。 #print( "++ Adding"、x、 "to"、definitely_in --interval_width + 1) my_ranges_2 [definitely_in --interval_width + 1] .append(x) ソート済み(my_ranges_2)の場合: print(a、my_ranges_2 [a]) #print(my_ranges_2 [a]) 忘れてしまった詳細があると思いますが、必要に応じてinterval_widthを調整して、コードが期待どおりに動作していることを確認し、必要なものを正確に知らせてください。 | 私が提案できる可能な解決策は、ある意味で「効率的」であり、入力データを1回だけ反復し、依存関係はありません。もちろん、コストは、純粋なpythonで記述され(より最適化されたコードがある可能性があります)、繰り返しを防ぐためにより多くの追跡変数を導入することです(したがって、Pythonは少なくなります)。 def slide_window(data、duration、start = 0、overlap = 1): 結果= [] data_idx = 0 result_idx = 0 アッパー=開始+期間 下=開始 next_lower = upper-オーバーラップ #空の内部リストを挿入ポイントまで埋めて挿入する内部ヘルパー def pad_and_append(at): while len(result)<= at: result.append([]) result [at] .append(data [data_idx]) #入力データを反復処理する 一方、data_idx aの場合: x = l [0])&(L = i)&(L