考虑数组 a
a = np.array([3, 3, np.nan, 3, 3, np.nan])
我可以做
np.isnan(a).argmax()
但这需要找到所有对象np.nan
才可以找到第一个。
有没有更有效的方法?
我一直在试图找出我是否可以传递参数np.argpartition
,从而np.nan
获取的第一个分类,而不是最后一次。
编辑关于[dup]。
有几个原因使这个问题不同。
isnan
。编辑有关第二个[dup]。
仍然要解决平等问题,而问题/答案却是古老的,很可能已经过时了。
我提名
a.argmax()
带有@fuglede's
测试数组:
In [1]: a = np.array([np.nan if i % 10000 == 9999 else 3 for i in range(100000)])
In [2]: np.isnan(a).argmax()
Out[2]: 9999
In [3]: np.argmax(a)
Out[3]: 9999
In [4]: a.argmax()
Out[4]: 9999
In [5]: timeit a.argmax()
The slowest run took 29.94 ....
10000 loops, best of 3: 20.3 µs per loop
In [6]: timeit np.isnan(a).argmax()
The slowest run took 7.82 ...
1000 loops, best of 3: 462 µs per loop
我尚未numba
安装,因此可以进行比较。但是我的相对加速比short
是@fuglede's
6倍以上。
我正在Py3中接受测试<np.nan
,而Py2则发出运行时警告。但是代码搜索表明这不依赖于该比较。
/numpy/core/src/multiarray/calculation.c
PyArray_ArgMax
与轴一起玩(将感兴趣的一个移动到最后),并将动作委派给arg_func = PyArray_DESCR(ap)->f->argmax
,该函数取决于dtype。
在numpy/core/src/multiarray/arraytypes.c.src
它看起来像BOOL_argmax
短路,一旦遇到一回True
。
for (; i < n; i++) {
if (ip[i]) {
*max_ind = i;
return 0;
}
}
并且@fname@_argmax
最大短路nan
。np.nan
也是“最大” argmin
。
#if @isfloat@
if (@isnan@(mp)) {
/* nan encountered; it's maximal */
return 0;
}
#endif
c
欢迎经验丰富的编码人员发表评论,但在我看来,至少对于np.nan
,argmax
您会以最快的速度平原。
玩9999
in生成a
表明a.argmax
时间取决于该值,与短路一致。
我需要得到一个32位数字中的1位数字,其中只有一个1位(总是)。在C++或ASM中最快的方法。 例如
很抱歉打扰你,但我无法找到一个有效的解决我的问题的方法。我想做一个MongoDB查询,让我得到与SQL查询相同的结果:
给定一个
给定,设置任意位数和位位置(0-63) 对位置X或更低的位进行计数或在X处的位未设置时返回0的最有效的方法是什么 注意:如果设置了该位,则返回值将始终至少为1 注意:这不是一个如何计算32位整数中设置位数的dup吗?因为它询问的是0到X范围以外的所有位
问题内容: 每个“产品”最多可以有10000个“细分”行。这些细分受众群具有一个针对每种产品(1、2、3、4、5,…)从1开始的排序列,以及一个值列,该列可以包含诸如(323.113、5423.231、873.42、422.64、763.1,…)。 我想确定给定细分子集的产品的潜在匹配。例如,如果我按正确的顺序有5个细分值,那么如何在细分表中某处有效地找到所有具有相同顺序的5个细分的所有产品? 问
我有一个向量,想找到第一个大于100的值的位置。