将 Numpy 数组折叠为标量,例如,乘以零
Collapse Numpy arrays to scalar when, e.g., multiplying by zero
令我有点惊讶的是,我找不到一个简单的时间来折叠包含相同值的 Numpy 数组的维度。让我解释一下。
我可能不得不乘以以数组形式实现的时间序列,比如 a * b
。在大多数情况下,这很好,但有时 a
或 b
是表示常量信号的标量。这也很顺利,因为 Numpy 知道如何广播它们,并且计算速度非常快(速度是 b
是一个充满相同值的数组的两倍)。
现在有时a = 0
;结果,我得到了一个全是零的数组。我想把它折叠成标量 0
因为它是一个恒定信号,但我似乎找不到任何简单的方法来做到这一点——我的意思是,没有添加条件来检查是否 a
或 b
为 0,每次我对数组进行操作时都将其视为特例。
您知道实现此目的的任何简单方法吗?
测试用例是您最好的选择。 Numpy 通常不会假定知道您的数据内容,因此它只会按照您告诉它的去做。具体来说,正如您所指出的,广播操作的结果将是广播的结果。任何不足都会破坏 Python 最小意外原则。
这是我认为最简单的方法:
c = a * b
if not c.any():
c = c[0].item()
还有其他选择。第一个想到的是使用 (c == 0).all()
,但这涉及第二个临时数组,浪费内存并有效地抵消了短路的好处。
另一种方法是检查 a
或 b
是否预先为零。但要彻底做到这一点,您需要检查以下内容:
a = [1, 0, 2, 0, 3, 0]
b = [0, 1, 0, 2, 0, 3]
因此简单地将两个数组相乘然后检查可能是您最好的选择。
令我有点惊讶的是,我找不到一个简单的时间来折叠包含相同值的 Numpy 数组的维度。让我解释一下。
我可能不得不乘以以数组形式实现的时间序列,比如 a * b
。在大多数情况下,这很好,但有时 a
或 b
是表示常量信号的标量。这也很顺利,因为 Numpy 知道如何广播它们,并且计算速度非常快(速度是 b
是一个充满相同值的数组的两倍)。
现在有时a = 0
;结果,我得到了一个全是零的数组。我想把它折叠成标量 0
因为它是一个恒定信号,但我似乎找不到任何简单的方法来做到这一点——我的意思是,没有添加条件来检查是否 a
或 b
为 0,每次我对数组进行操作时都将其视为特例。
您知道实现此目的的任何简单方法吗?
测试用例是您最好的选择。 Numpy 通常不会假定知道您的数据内容,因此它只会按照您告诉它的去做。具体来说,正如您所指出的,广播操作的结果将是广播的结果。任何不足都会破坏 Python 最小意外原则。
这是我认为最简单的方法:
c = a * b
if not c.any():
c = c[0].item()
还有其他选择。第一个想到的是使用 (c == 0).all()
,但这涉及第二个临时数组,浪费内存并有效地抵消了短路的好处。
另一种方法是检查 a
或 b
是否预先为零。但要彻底做到这一点,您需要检查以下内容:
a = [1, 0, 2, 0, 3, 0]
b = [0, 1, 0, 2, 0, 3]
因此简单地将两个数组相乘然后检查可能是您最好的选择。