代码之家  ›  专栏  ›  技术社区  ›  fales

Python中的许多对的相同操作

  •  1
  • fales  · 技术社区  · 6 年前

    在Python中,我想为数组计算一个函数,然而,一个成对的数组(或者更一般的数组)。

    我知道我可以对标量数组执行此操作:

    def f_test(scalar, pair):      
        return scalar + pair[0] + pair[1]
    
    result = f_test(numpy.linspace(0, 9, 10), [3, 4])
    

    并得到期望的结果:

    [  7.   8.   9.  10.  11.  12.  13.  14.  15.  16.]
    

    因此,该对是固定的,标量是从数组中获取的。

    问题是:可以用另一种方式吗?标量保持不变。。。 是否可以从向量中提取对,以再次获得与结果长度相同的向量?

    这是for(类似于,例如,不一定是numpy.array)

    scalar = 0
    pair = numpy.array([ [1,2], [3,7], [5,8] ])
    

    获得

    [ 3, 10, 13 ]
    

    而不是

    [4, 9]
    

    注意:为了保持示例的简单性,我简化了需要对数字执行的操作。

    如果无法完成或更一般: 最佳实践是什么(在Python中!)要在大量阵列上执行相同的操作?

    注意:我在搜索这个主题,甚至发现了一些类似的问题。然而,我不确定他们是否真的一样,更重要的是没有找到答案。在我看来,这是一个普遍需要的手术,我问了一个单独的问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   pault Tanjin    6 年前

    一个解决方案是 transpose pair :

    f_test(scalar, pair.T)
    #array([ 3, 10, 13])
    

    或者您可以使用列表理解:

    [f_test(scalar=scalar, pair=p) for p in pair]
    #[3, 10, 13]
    

    计时结果

    看起来第一种方法要快得多。对于长度为100000的阵列,在我的计算机上,速度提高了约270倍!

    N = 100000
    scalar = 0
    pair = np.array([[np.random.randint(0,10), np.random.randint(0,10)] for i in range(N)])
    
    # Using transpose
    %%timeit
    f_test(scalar, pair.T)
    #1000 loops, best of 3: 229 µs per loop
    
    # List comprehension
    %%timeit
    [f_test(scalar=scalar, pair=p) for p in pair]
    #10 loops, best of 3: 62 ms per loop