【问题标题】:numpy first occurence in array for an array of reference valuesnumpy 在数组中第一次出现参考值数组
【发布时间】:2018-06-30 06:10:40
【问题描述】:

给定一个阈值alpha 和一个numpy 数组a,有多种可能找到第一个索引i 使得arr[i] > alpha;见Numpy first occurrence of value greater than existing value:

numpy.searchsorted(a, alpha)+1
numpy.argmax(a > alpha)

在我的例子中,alpha 可以是标量或任意形状的数组。我想要一个函数get_lowest 在这两种情况下都有效:

alpha = 1.12
arr = numpy.array([0.0, 1.1, 1.2, 3.0])
get_lowest(arr, alpha)  # 2

alpha = numpy.array(1.12, -0.5, 2.7])
arr = numpy.array([0.0, 1.1, 1.2, 3.0])
get_lowest(arr, alpha)  # [2, 0, 3]

有什么提示吗?

【问题讨论】:

  • 澄清一下:arr 始终是 1d 且已排序?你独立对待alpha的元素? arralpha 的相对大小是多少?对alpha 的简单迭代可能是最快的,尤其是当searchsorted 是单个值的最佳工具时。
  • @hpaulj alpha 可以是任意形状的数组,通常比arr 大得多。
  • 我想起了一个padding 问题- 可变长度列表。 @Divakar 的解决方案风格可能很有用,stackoverflow.com/questions/43924187/…

标签: python arrays numpy vectorization


【解决方案1】:

searchsorted 确实有效:

numpy.searchsorted(a, alpha)

argmaxaxis 参数有帮助;这个

numpy.argmax(numpy.add.outer(alpha, -a) < 0, axis=-1)

成功了。确实

import numpy

a = numpy.array([0.0, 1.1, 1.2, 3.0])

alpha = 1.12

numpy.argmax(numpy.add.outer(alpha, -a) < 0, axis=-1)  # 0
numpy.searchsorted(a, alpha)  # 0

alpha = numpy.array([1.12, -0.5, 2.7])
numpy.argmax(numpy.add.outer(alpha, -a) < 0, axis=-1)  # [2 0 3]
numpy.searchsorted(a, alpha)  # [2 0 3]

【讨论】:

    【解决方案2】:

    你可以使用广播:

    In [9]: arr = array([ 0. ,  1.1,  1.2,  3. ])
    In [10]: alpha = array([ 1.12, -0.5 ,  2.7 ])
    In [11]: np.argmax(arr > np.atleast_2d(alpha).T, axis=1)
    Out[11]: array([2, 0, 3])
    

    要折叠多维数组,您可以使用np.squeeze,但如果您希望在第一种情况下使用 Python 浮点数,则可能需要做一些特殊的事情:

    def get_lowest(arr, alpha):
        b = np.argmax(arr > np.atleast_2d(alpha).T, axis=1)
        b = np.squeeze(b)
        if np.size(b) == 1:
            return float(b)
        return b
    

    【讨论】:

    • 感谢您的回答!不幸的是,如果输入是浮点数,这将返回一个数组(形状为1,1)。我需要一个花车。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2017-09-14
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多