您可以使用按位 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]
解释
按位与运算符与 1 一起使用,它起作用的原因是,以二进制形式写入的奇数必须有它的第一个数字为 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
与 1 的 AND 操作将仅返回 1(二进制中的 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
这与问题并不完全相关,但对于数据科学家和计算机视觉工程师来说,这种方法可能很有用。