当前位置: 首页 > 面试题库 >

numpy:有效地与索引数组求和

程磊
2023-03-14
问题内容

假设我有2个矩阵M和N(都具有> 1列)。我也有一个包含2列的索引矩阵I-
M代表1列,N代表1列。N的索引是唯一的,但是M的索引可能会出现多次。我要执行的操作是

for i,j in w:
  M[i] += N[j]

除了for循环以外,还有其他更有效的方法吗?


问题答案:

为了完整起见,在numpy> = 1.8中,您还可以使用np.addat方法:

In [8]: m, n = np.random.rand(2, 10)

In [9]: m_idx, n_idx = np.random.randint(10, size=(2, 20))

In [10]: m0 = m.copy()

In [11]: np.add.at(m, m_idx, n[n_idx])

In [13]: m0 += np.bincount(m_idx, weights=n[n_idx], minlength=len(m))

In [14]: np.allclose(m, m0)
Out[14]: True

In [15]: %timeit np.add.at(m, m_idx, n[n_idx])
100000 loops, best of 3: 9.49 us per loop

In [16]: %timeit np.bincount(m_idx, weights=n[n_idx], minlength=len(m))
1000000 loops, best of 3: 1.54 us per loop

除了明显的性能劣势外,它还有两个优点:

  1. np.bincount将其权重转换为双精度浮点数,.at将与数组的本机类型一起使用。这使其成为处理例如复数的最简单选择。
  2. np.bincount仅将权重加在一起,您就有了at一种用于所有ufunc的方法,因此您可以重复multiply,或logical_and或任何您喜欢的方式。

但是对于您的用例,np.bincount可能是要走的路。



 类似资料:
  • 我有一个疑问。有没有一种有效的方法来求一个numpy矩阵的所有邻域的和而不使用几个条件? 这是一个例子: 当我运行时,它返回我3,而不是一个错误,因此如果我想将1添加到一个值的所有邻居中,我需要使用很多条件,因为我不能只使用,因为在这种情况下以及在其他情况下,它只返回我一个“假邻居”

  • 问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由

  • 问题内容: 我对python和numpy很陌生。请问有人可以帮助我了解如何对用作索引的某些数组进行索引。我有以下六个2D阵列- 我想将这些数组用作索引,并将值10放入新的空矩阵的相应索引中。输出应如下所示: 到目前为止,我已经尝试过 但这给了我错误的输出。任何帮助请。 问题答案: 工作原理: 如果您在工作分配中使用 两个 numpy数组建立索引, 然后认为NumPy的作为过的各元件同时移动和中的每

  • 问题内容: 我有一个像这样的numpy数组: 并想创建一个数组,其中索引0中的值在索引1中,索引1在索引2中,依此类推。 我想要的输出是: 我猜想有一个简单的方法可以做到这一点,而无需遍历整个数组。我如何以numPythonic的方式做到这一点? 问题答案: 您可以使用 要么

  • 问题内容: 我目前在一个项目中,需要执行一些步骤,以处理旧版Matlab代码(使用Matlab引擎),其余部分则使用Python(numpy)进行处理。 我注意到,将结果从Matlab转换为numpy的速度似乎非常慢。 这是一些示例代码,用于从另一个ndarray,列表和mlarray创建具有1000个元素的ndarray: 这需要以下时间: 转换所需时间约为列表转换的100倍。 有什么办法可以加

  • 问题内容: 我有一个Numpy数组和一个索引列表,我想将其值加1。该列表可能包含重复的索引,我希望增量可以随每个索引的重复次数而缩放。没有重复,命令很简单: 通过重复,我想出了以下方法。 这是最好的方法吗?假设和操作将导致相同的排序顺序是否有风险?我是否缺少一些简单的Numpy操作来解决此问题? 问题答案: 做完之后 为什么不这样做: (为进一步简化而编辑。)