2つのTrue(ブール値1)値を連続してチェックする最速および/または最もPython的な方法は何ですか?

Rainymood

私はこの解決策を思いついたが、これをより良く、より速く、またはよりパイソン的な方法で行う組み込み関数があるかどうか疑問に思っていた

import numpy as np
import pandas as pd

n = 1 #number of trials
p = 0.5 #prob of succes
k = 50 #amount of reptitions

s = pd.Series(np.random.binomial(n, p, k)).to_frame()
s.columns = ['data']
s['shifted'] = s['data'].shift(1)
s['lagged'] = s['data'].shift(-1)
s['two_ones_in_a_row'] = (s['data'] & s['lagged']) | (s['data'] & s['shifted'])
ジェズリール

私の意見では、解決策は素晴らしいです、また新しい列は必要ありません、あなたは以下によって比較することができますSeries

s = pd.Series(np.random.binomial(n, p, k)).to_frame()
s.columns = ['data']
s1= s['data'].shift(1)
s2 = s['data'].shift(-1)
s['two_ones_in_a_row'] = (s['data'] & s2) | (s['data'] & s1)

パフォーマンスが重要な場合は、numpyを使用してください。

a = s['data'].values.astype(bool)
s['two_ones_in_a_row1'] = (a & np.append(a[1:], False)) | (a & np.append(False, a[:-1]))

n = 1 #number of trials
p = 0.5 #prob of succes
k = 50000 #amount of reptitions

s = pd.Series(np.random.binomial(n, p, k)).to_frame()
s.columns = ['data']


In [153]: %%timeit 
     ...: s1= s['data'].shift(1)
     ...: s2 = s['data'].shift(-1)
     ...: s['two_ones_in_a_row'] = (s['data'] & s2) | (s['data'] & s1)
     ...: 
21 ms ± 581 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [154]: %%timeit
     ...: a = s['data'].values.astype(bool)
     ...: s['two_ones_in_a_row1'] = (a & np.append(a[1:], False)) | (a & np.append(False, a[:-1]))
     ...: 
213 µs ± 2.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ