私は観測時間を表す浮動小数点値のリストを持っています。 (各フロート値は実際には整数で表すことができますが、将来の可能性について一般化したいと考えています)。どのようにして、重複を含むソートされたリストの連続していないフロート要素の間に1つのパッドをゼロにすることができますか?
list_hrs = [4,6,8,8,10] # actual list is thousands of floats
重複したエントリの唯一の発生をカウントしながら、私はパッドにゼロで、それぞれのインデックスに一致しない値をしようとしています。例えば、リストごとに、私は0
から3
に包括的に4つの数字があるので
list_hrs = [0,0,0,0,4,0,6,0,8,8,0,10]
最初の4つのエントリが0
をしているのでしょう。 5
がないので、0
が4
と6
の間にあります。 0
は6
と8
の間で同様です。値9
が存在しないため、0
が8
と10
の間にあります。また、複製の8
はそのまま残しておきます。これは後で私のコードで扱います。 0
のパディングの前に、複製の1つだけがカウントされるべきです(8
)。私はその後、別のSOの記事を読んで、それが最初0
年代のリスト、そのため長さがあるべきを作るのがベストだという印象を離れて来た
for index in range(len(list_hrs)):
if list_hrs != index:
list_hrs.insert(index, 0)
>> [0, 0, 0, 0, 0, 4, 6, 8, 8, 10]
:
私の最初の試みは、これを試してみました考慮するデータポイントの数に等しい。次に、ゼロ以外のエントリは0
のエントリを置き換えることができます。だから、私は次のように試した:
def make_zeros(hrs=list_hrs): # make list of 0's
num_zer = int(max(hrs))
list_zer = [0 for index in range(num_zer+1)]
return list_zer
しかし、私はこのポイントの後に希望の結果を達成するための条件を実装する方法がわかりません。私はenumerate
を使用してインデックスがそのインデックスの値と一致するかどうかを確認する方法があると考えていますが、重複したエントリ(上記の例の8
のようなもの)のために続行する方法がわかりません。
この方法は継続的に使用するのに適していますか、目的の結果を達成するための効率的な/簡単な方法がありますか?助けやアドバイスをいただければ幸いです。
def make_zeros_vectorized(A, dtype=float):
a = np.asarray(A).astype(int)
idx = a + np.r_[0, (a[1:] == a[:-1]).cumsum()]
out = np.zeros(idx[-1]+1,dtype=dtype)
out[idx] = A
return out
サンプルの実行 - -
彼らはなぜ浮動小数点数がありますか、そこに10進数を期待していますか? '4.2'と言うように?もしそうなら、出力はどのように見えますか? – Divakar
また、入力は常にソートされますか? – Divakar
各フロートは実際には整数として解釈できます。サンプルリストは実際には '[4.0,6.0,8.0,8.0,10.0]'でなければなりません。私はコードを一般化することを望んでいました。しかし、整数の場合の解があれば、この場合はうまくいくでしょう。 – mikey