【发布时间】:2019-01-13 15:33:24
【问题描述】:
假设我有一个这样的数组:
import numpy as np
base_array = np.array([-13, -9, -11, -3, -3, -4, 2, 2,
2, 5, 7, 7, 8, 7, 12, 11])
假设我想知道:“base_array 中有多少个元素大于 4?”这可以通过利用广播简单地完成:
np.sum(4 < base_array)
答案是7。现在,假设我不想与单个值进行比较,而是想在一个数组上执行此操作。换句话说,对于comparison_array 中的每个值c,找出base_array 有多少个元素大于c。如果我以天真的方式这样做,它显然会失败,因为它不知道如何正确广播它:
comparison_array = np.arange(-13, 13)
comparison_result = np.sum(comparison_array < base_array)
输出:
Traceback (most recent call last):
File "<pyshell#87>", line 1, in <module>
np.sum(comparison_array < base_array)
ValueError: operands could not be broadcast together with shapes (26,) (16,)
如果我能以某种方式将comparison_array 的每个元素广播到base_array 的形状,那将解决这个问题。但我不知道如何进行这样的“元素广播”。
现在,我知道如何使用列表理解来实现这两种情况:
first = sum([4 < i for i in base_array])
second = [sum([c < i for i in base_array])
for c in comparison_array]
print(first)
print(second)
输出:
7
[15, 15, 14, 14, 13, 13, 13, 13, 13, 12, 10, 10, 10, 10, 10, 7, 7, 7, 6, 6, 3, 2, 2, 2, 1, 0]
但众所周知,这将比在更大数组上正确矢量化的numpy 实现慢几个数量级。那么,我应该如何在numpy 中执行此操作以使其快速?理想情况下,此解决方案应扩展到广播工作的任何类型的操作,而不仅仅是本示例中的大于或小于。
【问题讨论】:
标签: python arrays numpy vectorization array-broadcasting