将 Numpy 数组折叠为标量,例如,乘以零

Collapse Numpy arrays to scalar when, e.g., multiplying by zero

令我有点惊讶的是,我找不到一个简单的时间来折叠包含相同值的 Numpy 数组的维度。让我解释一下。

我可能不得不乘以以数组形式实现的时间序列,比如 a * b。在大多数情况下,这很好,但有时 ab 是表示常量信号的标量。这也很顺利,因为 Numpy 知道如何广播它们,并且计算速度非常快(速度是 b 是一个充满相同值的数组的两倍)。

现在有时a = 0;结果,我得到了一个全是零的数组。我想把它折叠成标量 0 因为它是一个恒定信号,但我似乎找不到任何简单的方法来做到这一点——我的意思是,没有添加条件来检查是否 ab 为 0,每次我对数组进行操作时都将其视为特例。

您知道实现此目的的任何简单方法吗?

测试用例是您最好的选择。 Numpy 通常不会假定知道您的数据内容,因此它只会按照您告诉它的去做。具体来说,正如您所指出的,广播操作的结果将是广播的结果。任何不足都会破坏 Python 最小意外原则。

这是我认为最简单的方法:

c = a * b
if not c.any():
    c = c[0].item()

还有其他选择。第一个想到的是使用 (c == 0).all(),但这涉及第二个临时数组,浪费内存并有效地抵消了短路的好处。

另一种方法是检查 ab 是否预先为零。但要彻底做到这一点,您需要检查以下内容:

a = [1, 0, 2, 0, 3, 0]
b = [0, 1, 0, 2, 0, 3]

因此简单地将两个数组相乘然后检查可能是您最好的选择。