gpt4 book ai didi

python - 用 bool 数组掩盖系列

转载 作者:太空狗 更新时间:2023-10-29 21:54:28 30 4
gpt4 key购买 nike

这给我带来了很多麻烦,我对numpy数组与pandas系列的不兼容感到困惑。例如,当我使用系列创建 bool 数组时

x = np.array([1,2,3,4,5,6,7])
y = pd.Series([1,2,3,4,5,6,7])
delta = np.percentile(x, 50)
deltamask = x- y > delta

delta mask 创建一个 bool pandas 系列。

但是,如果你这样做

x[deltamask]
y[deltamask]

你发现数组完全忽略了掩码。不会出现错误,但最终会得到两个不同长度的对象。这意味着像这样的操作

x[deltamask]*y[deltamask]

导致错误:

print type(x-y)
print type(x[deltamask]), len(x[deltamask])
print type(y[deltamask]), len(y[deltamask])

更令人困惑的是,我注意到运算符 < 的处理方式不同。例如

print type(2*x < x*y)
print type(2 < x*y)

会分别给你一个 pd.series 和 np.array。

此外,

5 < x - y

结果是一个系列,所以看起来系列优先,而系列掩码的 bool 元素在传递给 numpy 数组并产生切片数组时被提升为整数。

这是什么原因?

最佳答案

花式索引

就目前的 numpy 而言,numpy 中的花式索引工作方式如下:

  1. 如果括号之间的东西是tuple (无论是否使用显式括号),元组的元素是 x 不同维度的索引。 .例如,x[(True, True)]x[True, True]会提高IndexError: too many indices for array在这种情况下是因为 x是一维的。但是,在异常发生之前,也会发出警告:VisibleDeprecationWarning: using a boolean instead of an integer will result in an error in the future .

  2. 如果括号之间的东西正好一个ndarray ,不是子类或其他类似数组,并且具有 bool 类型,它将被用作掩码。这就是为什么 x[deltamask.values]给出了预期的结果(空数组,因为 deltamask 都是 False

  3. 如果括号之间的东西是任何类似数组的东西,是否是像Series这样的子类或者只是一个 list ,或其他东西,它被转换为 np.intp数组(如果可能)并用作整数索引。所以x[deltamask]产生相当于 x[[False] * 7] 的东西或者只是 x[[0] * 7] .在这种情况下,len(deltamask)==7x[0]==1所以结果是[1, 1, 1, 1, 1, 1, 1] .

这种行为是违反直觉的,FutureWarning: in the future, boolean array-likes will be handled as a boolean array index它生成表明修复正在进行中。当我发现/对 numpy 进行任何更改时,我将更新此答案。

此信息可以在 Sebastian Berg 对我在 Numpy 讨论中的初始查询的回复中找到 here .

关系运算符

现在让我们来解决您的问题的第二部分,即比较的工作原理。关系运算符( <><=>= )通过在被比较的对象之一上调用相应的方法来工作。对于 <这是__lt__ .但是,不仅仅是调用 x.__lt__(y)对于表达式 x < y , Python 实际上检查被比较对象的类型。如果yx 的子类型实现比较,那么 Python 更喜欢调用 y.__gt__(x)相反,无论您如何编写原始比较。唯一的方法x.__lt__(y)如果 y 将被调用是 x 的子类如果y.__gt__(x)返回 NotImplemented表示不支持该方向的比较。

当您执行 5 < x - y 时会发生类似的事情.同时 ndarray不是 int 的子类, 比较 int.__lt__(ndarray)返回 NotImplemented ,所以 Python 实际上最终调用了 (x - y).__gt__(5) ,这当然是定义好的并且工作得很好。

所有这些的更简洁的解释可以在 Python docs 中找到.

关于python - 用 bool 数组掩盖系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39145795/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com