Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加到由另一个数组索引的数组的矢量化方法—Python/NumPy_Python_Numpy_Vectorization - Fatal编程技术网

添加到由另一个数组索引的数组的矢量化方法—Python/NumPy

添加到由另一个数组索引的数组的矢量化方法—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 ...:

我有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
     ...: 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循环,你可以试着把两种治疗都放在同一个循环中。如果您需要帮助,请显示更多代码。请给出一个小示例,这样就不会像您期望的那样模棱两可。非常感谢。我真的很感谢你的时间和帮助。非常感谢。我真的很感谢你的时间和帮助。非常感谢。这对我很有帮助。非常感谢。这对我很有帮助。