ビットごとのAND演算子を使用できます&
:
>>> x = [1, 2, 3, 4, 5, 6, 7]
>>> y = [i for i in x if i&1]
[1, 3, 5, 7]
これにより、リスト内の奇妙な要素が得られます。ここで、奇数のインデックスの要素を抽出するには、上記を少し変更する必要があります。
>>> x = [10, 20, 30, 40, 50, 60, 70]
>>> y = [j for i, j in enumerate(x) if i&1]
[20, 40, 60]
説明
ビットごとのAND演算子は1で使用されます。これが機能する理由は、2進数で記述された場合の奇数は、最初の桁が1でなければならないためです。確認してみましょう。
23 = 1 * (2**4) + 0 * (2**3) + 1 * (2**2) + 1 * (2**1) + 1 * (2**0) = 10111
14 = 1 * (2**3) + 1 * (2**2) + 1 * (2**1) + 0 * (2**0) = 1110
AND演算は、値が奇数の場合、1のみを返します(2進数の1も最後の桁1を持ちます)。
詳細については、Pythonビット演算子のページを確認してください。
PS:データフレームで奇数列と偶数列を選択する場合は、この方法を戦術的に使用できます。顔のキーポイントのx座標とy座標が、列x1、y1、x2などとして指定されているとします。x座標とy座標を各画像の幅と高さの値で正規化するには、次のようにします。
for i in range(df.shape[1]):
if i&1:
df.iloc[:, i] /= heights
else:
df.iloc[:, i] /= widths
これは質問と正確には関係ありませんが、データサイエンティストやコンピュータービジョンエンジニアにとって、この方法は役立つ可能性があります。