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

根据数组的值求和

尹承泽
2023-03-14
问题内容

我有未排序的索引数组:

i = np.array([1,5,2,6,4,3,6,7,4,3,2])

我也有一个相同长度的值数组:

v = np.array([2,5,2,3,4,1,2,1,6,4,2])

我有期望值为零的数组:

d = np.zeros(10)

现在,我想根据v在d中的索引将其添加到元素中。

如果我用普通的python做,我会这样:

for index,value in enumerate(v):
    idx = i[index]
    d[idx] += v[index]

这是丑陋且效率低下的。我该如何更改?


问题答案:

我们可以使用np.bincount据称对这种累积加权计数非常有效的方法,所以这里有一个-

counts = np.bincount(i,v)
d[:counts.size] = counts

或者,使用minlength输入参数,对于一般情况,当d可以是任何数组,而我们想添加到该数组中时,

d += np.bincount(i,v,minlength=d.size).astype(d.dtype, copy=False)

运行时测试

本节将本文中np.add.at列出的基础方法other post与本文np.bincount前面列出的基础方法进行比较。

In [61]: def bincount_based(d,i,v):
    ...:     counts = np.bincount(i,v)
    ...:     d[:counts.size] = counts
    ...: 
    ...: def add_at_based(d,i,v):
    ...:     np.add.at(d, i, v)
    ...:

In [62]: # Inputs (random numbers)
    ...: N = 10000
    ...: i = np.random.randint(0,1000,(N))
    ...: v = np.random.randint(0,1000,(N))
    ...: 
    ...: # Setup output arrays for two approaches
    ...: M = 12000
    ...: d1 = np.zeros(M)
    ...: d2 = np.zeros(M)
    ...:

In [63]: bincount_based(d1,i,v) # Run approaches
    ...: add_at_based(d2,i,v)
    ...:

In [64]: np.allclose(d1,d2)  # Verify outputs
Out[64]: True

In [67]: # Setup output arrays for two approaches again for timing
    ...: M = 12000
    ...: d1 = np.zeros(M)
    ...: d2 = np.zeros(M)
    ...:

In [68]: %timeit add_at_based(d2,i,v)
1000 loops, best of 3: 1.83 ms per loop

In [69]: %timeit bincount_based(d1,i,v)
10000 loops, best of 3: 52.7 µs per loop


 类似资料:
  • 问题内容: 我正在使用以下代码来解析yaml并应将输出作为对象,并且该函数应更改数据结构并根据以下结构提供输出 这是我尝试过的方法,但是我不确定如何从yaml中获取的值 替换 函数运行器中 的硬代码值 与来自 这就是我尝试过的所有想法,该怎么做? 问题答案: 将runners对象的名称分配给名称的struct 字段,并使用与名称匹配的函数命令将命令列表附加到type字段: 操场上的工作代码

  • 问题内容: 我有一个像这样的数组: 我想基于“否”作为主键对数组中的元素进行分组。输出应如下所示: 请注意,作者的值是与主键``否’‘合并的,请问有人可以帮我吗? 我尝试这样做: 问题答案: 您可以使用通用函数: 我添加了一些示例代码进行测试

  • 问题内容: 我有一些具有相同值的数组,如下所示。 如果值重复,则将相同的总和相加。对于相同的不同,无需求和。 这就是我想要的。 我陷入上述问题。我已经尽力了。但是我得到了错误的结果。我非常感谢任何建议。 问题答案: @Cloud我已根据您的要求提供了功能,感谢@MI对此总和部分进行了研究。

  • 给定两个长度为n的有序数组,问题是在O(n)时间内找到它们的和数组的中值,该和数组包含数组A的每个元素和数组b的每个元素之间所有可能的成对和。 例如:设 A[2,4,6] 和 B[1,3,5] 是两个给定的数组。求和数组为 。在 O(n) 中查找此数组的中位数。 解决O(n^2)中的问题非常简单,但是对于这个问题,是否有任何O(n)解决方案? 注意:这是问我的一个朋友的面试问题,面试官很确定它可以

  • 使用提供的函数将每个元素映射到一个值后,返回一个数组的平均值。 使用 Array.map() 将每个元素映射到由 fn 返回的值,Array.reduce() 将每个值累加到累加器,用 0 作为累加器的初始值,再除以数组的 length 。 const averageBy = (arr, fn) => arr.map(typeof fn === 'function' ? fn : val =>

  • 本文向大家介绍PHP实现根据数组的值进行分组的方法,包括了PHP实现根据数组的值进行分组的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现根据数组的值进行分组的方法。分享给大家供大家参考,具体如下: PHP根据数组的值分组,php array中没有自带这个函数但是很常用,今天写了出来记录一下。 代码: 运行结果如下: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP