添加到由另一个数组索引的数组的矢量化方法—Python/NumPy
我有3个Numpy数组,a、b和c。 b和c是非常大的数组,具有相同的长度。b的每个元素是0、1或2,a的长度也是3。 现在我想知道是否有办法消除以下for循环:添加到由另一个数组索引的数组的矢量化方法—Python/NumPy,python,numpy,vectorization,Python,Numpy,Vectorization,我有3个Numpy数组,a、b和c。 b和c是非常大的数组,具有相同的长度。b的每个元素是0、1或2,a的长度也是3。 现在我想知道是否有办法消除以下for循环: for i in range(len(b)): a[b[i]] += c[i] 任何评论都将不胜感激。您可以使用这种基于ID的求和,如下所示- a += np.bincount(b,c,minlength=a.size) 运行时测试- In [136]: # Large arrays as inputs ...:
for i in range(len(b)):
a[b[i]] += c[i]
任何评论都将不胜感激。您可以使用这种基于ID的求和,如下所示-
a += np.bincount(b,c,minlength=a.size)
运行时测试-
In [136]: # Large arrays as inputs
...: a = np.random.rand(3)
...: c = np.random.rand(10000)
...: b = np.random.randint(0,3,10000)
...:
...: # Make copies for testing
...: a1 = a.copy()
...: a2 = a.copy()
...:
In [137]: def bincount_app(a, b, c): # bincount approach as func
...: a += np.bincount(b,c,minlength=a.size)
...:
In [138]: %timeit np.add.at(a1, b, c) # @user2357112's soln
1000 loops, best of 3: 1.29 ms per loop
In [139]: %timeit bincount_app(a2, b, c)
10000 loops, best of 3: 36.6 µs per loop
您可以使用这种基于ID的求和,如下所示-
a += np.bincount(b,c,minlength=a.size)
运行时测试-
In [136]: # Large arrays as inputs
...: a = np.random.rand(3)
...: c = np.random.rand(10000)
...: b = np.random.randint(0,3,10000)
...:
...: # Make copies for testing
...: a1 = a.copy()
...: a2 = a.copy()
...:
In [137]: def bincount_app(a, b, c): # bincount approach as func
...: a += np.bincount(b,c,minlength=a.size)
...:
In [138]: %timeit np.add.at(a1, b, c) # @user2357112's soln
1000 loops, best of 3: 1.29 ms per loop
In [139]: %timeit bincount_app(a2, b, c)
10000 loops, best of 3: 36.6 µs per loop
NumPy UFUNC有一种处理此类情况的方法:
numpy.add.at(a, b, c)
这就是每个人在看到索引数组b不起作用之前,都希望a[b]+=c对它所做的事情。NumPy UFUNC有一种处理类似情况的方法:
numpy.add.at(a, b, c)
这正是每个人在看到索引数组b不起作用之前所期望的[b]+=c对数组b所做的。你想消除for循环,并且仍然有一个修改过的方法吗?是的,消除“for”并获得相同的结果你必须迭代没有其他方法,你可以合并2个for循环,这样你只能迭代一次,但你不能回避,谁说了一个?我说如果你在这个循环之前有一个for循环,你可以试着把两种治疗都放在同一个循环中。如果您需要帮助,请显示更多代码。请给出一个小示例,这样就不会像您期望的那样出现歧义。您希望消除for循环,并且仍然以这种方式进行修改吗?是的,消除“for”并获得相同的结果您必须进行迭代没有其他方法,您可以合并2个for循环,这样您只需迭代一次,但你不能回避,谁说了一个?我说如果你在这个循环之前有一个for循环,你可以试着把两种治疗都放在同一个循环中。如果您需要帮助,请显示更多代码。请给出一个小示例,这样就不会像您期望的那样模棱两可。非常感谢。我真的很感谢你的时间和帮助。非常感谢。我真的很感谢你的时间和帮助。非常感谢。这对我很有帮助。非常感谢。这对我很有帮助。