【问题标题】:Slicing and Assignment切片和赋值
【发布时间】:2021-01-15 17:25:18
【问题描述】:

我必须编写一个函数,给定一个数组 (A) 和 2 个数字(X 和 Y,X

[1, 1, 9, 4, 2, 9].

到目前为止,这是我的代码:

def subtract_bw_elements(A,x,y):

    values_in_between = my_array[(my_array > x) & (my_array < y)] - 3

    return values_in_between

my_array = np.array([1, 4, 9, 7, 5, 9])
final_array = subtract_bw_elements(my_array,3,8)

print(final_array)

当我运行它时,我得到这个输出:

[1,4,2]

基本上,我可以得到一个减去 3 的值序列。如何将这个序列输入回我的原始数组?我相信我必须使用分配,但我真的不知道如何。

【问题讨论】:

    标签: python function numpy slice variable-assignment


    【解决方案1】:

    解决方案

    您可以使用布尔过滤器来选择元素,然后根据需要更新它们,例如:

    A = np.array([1, 4, 9, 7, 5, 9])
    x = 3
    y = 8
    cond1 = (A > x)
    cond2 = (A < y)
    A[cond1 & cond2] -= 3
    

    输出: array([1, 1, 9, 4, 2, 9])

    性能

    如果编写高性能代码同样容易,那就去做吧——你迟早会需要它。以下是 1M 元素的矢量化与列表理解解决方案的性能示例:

    def func_vectorized(A, offset=3, x=3, y=8):
        cond1 = (A > x)
        cond2 = (A < y)
        A[cond1 & cond2] -= offset
        return A
    
    def func_comprehension(A, offset=3, x=3, y=8):
        values_in_between = [i - offset if x<i<y else i for i in A]
        return values_in_between
    
    # initialize array with one million elements
    A = np.random.randint(0,20,1000000)
    A1 = A.copy()
    
    # compare performance of functions above using ipython `%timeit`:
    
    %timeit func_vectorized(A)
    # 911 µs ± 61.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    %timeit func_comprehension(A1)
    # 838 µs ± 58.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    在我的机器上,矢量化解决方案比列表理解快约 500 倍。

    【讨论】:

    • 使用* 是神秘的,使用布尔值&amp; 更清楚,就像OP 已经在做的那样
    【解决方案2】:

    您可以使用列表推导。根据您的需要迭代 Areturn 新列表:

    def subtract_bw_elements(A: list, x, y):
        return [x if x not in range(3, 8) else x-3 for x in A]
    
    print(subtract_bw_elements([1, 4, 9, 7, 5, 9], 3, 8)) # [1, 1, 9, 4, 2, 9]
    

    【讨论】:

      【解决方案3】:

      您可以通过使用列表推导来简单地实现这一点,如果其他,请检查以下示例:

      def subtract_bw_elements(A,x,y):
      
          values_in_between = [i - 3 if x<i<y else i for i in A]
      
          return values_in_between
      
      my_array = [1, 4, 9, 7, 5, 9]
      final_array = subtract_bw_elements(my_array,3,8)
      
      print(final_array)
      

      输出是

      [1, 1, 9, 4, 2, 9]
      

      【讨论】:

        【解决方案4】:

        您可以使用列表推导:

        import numpy as np
        
        def subtract_bw_elements(A,x,y):
            return [val-3 if val > x and val < y else val for val in A]
        
        my_array = np.array([1, 4, 9, 7, 5, 9])
        final_array = subtract_bw_elements(my_array,3,8)
        
        print(final_array)
        

        输出:[1, 1, 9, 4, 2, 9]

        注意:

        在您的函数中,您使用变量my_array,但您创建的参数A 包含完全相同的值,请使用A

        【讨论】:

          猜你喜欢
          • 2012-04-26
          • 1970-01-01
          • 2018-01-02
          • 2020-08-10
          • 2021-04-14
          • 2016-03-19
          • 2012-10-25
          • 2016-10-19
          相关资源
          最近更新 更多