当前位置: 首页 > 知识库问答 >
问题:

大于现有值的值的Numpy第一次出现

宗政和韵
2023-03-14

我有一个1D数组在Numpy和我想找到的索引的位置,其中一个值超过了Numpy数组中的值。

例如。

aa = range(-10,10)

aa中查找超过5值的位置。

共有3个答案

贺方伟
2023-03-14

我对此也很感兴趣,我已经将所有建议的答案与填充图进行了比较。(免责声明:我是的作者。)

如果您知道正在查看的数组已排序,则

numpy.searchsorted(a, alpha)

这是给你的。它是O(log(n))操作,即速度几乎不取决于阵列的大小。你再快不过了。

如果你对你的阵列一无所知,你不会错的

numpy.argmax(a > alpha)

已排序:

未分类:

重现情节的代码:

import numpy
import perfplot


alpha = 0.5
numpy.random.seed(0)


def argmax(data):
    return numpy.argmax(data > alpha)


def where(data):
    return numpy.where(data > alpha)[0][0]


def nonzero(data):
    return numpy.nonzero(data > alpha)[0][0]


def searchsorted(data):
    return numpy.searchsorted(data, alpha)


perfplot.save(
    "out.png",
    # setup=numpy.random.rand,
    setup=lambda n: numpy.sort(numpy.random.rand(n)),
    kernels=[argmax, where, nonzero, searchsorted],
    n_range=[2 ** k for k in range(2, 23)],
    xlabel="len(array)",
)
呼延承平
2023-03-14

给定数组的排序内容,还有一个更快的方法:搜索排序

import time
N = 10000
aa = np.arange(-N,N)
%timeit np.searchsorted(aa, N/2)+1
%timeit np.argmax(aa>N/2)
%timeit np.where(aa>N/2)[0][0]
%timeit np.nonzero(aa>N/2)[0][0]

# Output
100000 loops, best of 3: 5.97 µs per loop
10000 loops, best of 3: 46.3 µs per loop
10000 loops, best of 3: 154 µs per loop
10000 loops, best of 3: 154 µs per loop
段干德泽
2023-03-14

这要快一点(而且看起来更好)

np.argmax(aa>5)
In [2]: N = 10000

In [3]: aa = np.arange(-N,N)

In [4]: timeit np.argmax(aa>N/2)
100000 loops, best of 3: 52.3 us per loop

In [5]: timeit np.where(aa>N/2)[0][0]
10000 loops, best of 3: 141 us per loop

In [6]: timeit np.nonzero(aa>N/2)[0][0]
10000 loops, best of 3: 142 us per loop
 类似资料:
  • 问题内容: 我在numpy中有一个1D数组,我想在值超过numpy数组中的值的位置找到索引的位置。 例如 查找超出值的位置。 问题答案: 这有点快(看起来更好) 因为将在第一个位置停止(“如果多次出现最大值,则返回对应于第一个出现的索引。”)并且不会保存其他列表。

  • 我正在尝试计算Pandas数据帧中一个值与另一个值一起出现的次数,并计算每行的次数。 这就是我的意思: 假设我想计算与,我希望结果是: 这里的< code>freq(频率)列表示< code>a列中的值与< code>t列中的值一起出现的次数。 请注意,考虑到我的数据帧的大小,仅计算发生的次数的解决方案将导致错误的频率。 有没有办法在Python中实现这一点?

  • 我需要找到高于指定阈值的的第一个和最后一个元素。我找到了以下解决方案,这是有效的,但它看起来有点令人费解。有没有更简单/更蟒蛇的方式?

  • newitems[0]是直接拿到了区县的值了,现在是点击了区县追加给给this.ruleForm.address,现在点了第一个是正常的,第二次点击会追加、第三次也是点也是会追加,这不是我想要的效果 想要的效果是 点了第一次的值,赋给this.ruleForm.address,点了第二次就把第一次的值替换,第三次替换上一次的值,大佬们这个 要怎么弄呢?

  • 问题内容: 我需要一种快速的方法来保持运行最大的numpy数组。例如,如果我的数组是: 我想要: 显然我可以做一个小循环: 但是我的数组有成千上万的条目,我需要多次调用。似乎必须要有一个小技巧才能删除循环,但我似乎找不到任何有效的方法。另一种选择是将其编写为C扩展,但似乎我会重新发明轮子。 问题答案: 为我工作。