代码之家  ›  专栏  ›  技术社区  ›  Jennifer Crosby

如何在数组中只获取奇数并使用numpy for python将其平方?

  •  -1
  • Jennifer Crosby  · 技术社区  · 7 年前

    我在Python中没有使用NumPy:

    def fun_list(list_, x):
    #set list to odd numbers in list_ raised to number x
    s=[]    
    s= [i**x for i in list_ if (i%2)!=0]
    list_=s          
    print(list_)
    

    测试功能:

    list1 = [1, 2, 3, 4]
    list2 = [2, 3, 4, 5]
    print(fun_list(list1, 2))
    print(fun_list(list2, 3))    
    

    结果:

    [1, 9]
    None
    [27, 125]
    None
    

    现在需要用NumPy来做,我不明白,在网上找不到很多关于它的东西,我发现的东西对我来说没有意义。这就是我尝试过的:

    import math 
    #set list to odd numbers in list_ raised to number x
    a=np.array([array_])
    pwr=x
    a=np.array([a if np.mod(a)!=0])
    a=np.array([np.power(a,pwr)])
    print (a)
    

    测试功能:

    import numpy as np
    array1 = np.array([1, 2, 3, 4])
    array2 = np.array([2, 3, 4, 5])
    print(fun_array(array1, 2))
    print(fun_array(array2, 3))
    

    结果:

    File "<ipython-input-161-fc4f5193f204>", line 21
    a=np.array([a if np.mod(a)!=0])
                                 ^
    SyntaxError: invalid syntax
    

    我不知道如何使用NumPy只获取数组中的奇数。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Sheldore    7 年前

    干得好:

    a=np.array([1,2,3,4,5,6])
    power = 2
    answer = (a[a%2==1])**power
    print (answer)
    

    输出

    [ 1  9 25]
    

    这里,手术 a%2==1 返回布尔数组 array([ True, False, True, False, True, False], dtype=bool) 那就是 True 如果除以后的余数/模数 2 (由 a%2 )价值是 1 False 如果它 0 . 将此用作数组的参数 a 只会返回 参数为“True”的值。这只产生奇数 . 这个 ** 然后把这些奇数平方。如果你想要偶数,一种方法是 a%2==0 以你的情况。

        2
  •  1
  •   Mad Physicist    7 年前

    numpy的强大之处在于它允许您在单个操作中对整个数组进行操作。这称为矢量化或矢量化。当然,在幕后也有这样做的循环,但它们是用C语言编写的,并且经过高度优化,因此它们的运行速度比纯python所能达到的任何速度都要快。

    所以当你用numpy编写一个函数时,你的首要目标是让numpy完成所有的工作。理想情况下,不应该有显式循环,而应该只有对整个数组同时操作的调用。幸运的是,numpy提供了所有必要的实用程序,以便在您的情况下实现这一点。

    下面是一个循序渐进的指南:

    首先,将输入转换为数组。数组在很多方面就像列表,不同之处在于可以对它们执行矢量化操作。如果您传入一个列表,大多数numpy函数会将它们的输入静默地转换成一个数组,但是我们会显式地这样做:

    def numpy_fun_list(list_, x):
        arr = np.array(list_)
    

    到现在为止,一直都还不错。所有进一步的操作将 arr 而不是 list_ .

    接下来你要过滤掉偶数元素。最简单的方法是屏蔽数组。当用相同大小的布尔数组索引numpy数组时,它将选择布尔数组中为真的元素,并放弃其余元素。例如:

    >>> data = np.array([1, 2, 3, 4])
    >>> mask = np.narray([True, False, False, True])
    >>> data[mask]
    array([1, 4])
    

    所有条件运算符和比较运算符都创建这样的布尔数组。在您的例子中,您想要检查一个数字是否是奇数,所以您使用的模与Python中一样,只是模对数组的每个元素都进行操作:

        mask = (arr % 2) == 1
    

    接线员 == 是什么将模运算的结果转换为布尔掩码:

        arr = arr[mask]
    

    现在我们需要提高剩下的 阿里尔 给权力 x . 如你所料,这就是 np.power 做:

        arr = np.power(arr, x)
    

    就这样。现在您可以返回或打印结果。实际上,有一点要注意:

    原始函数将结果打印到屏幕上,但不返回。函数的返回值是隐式的 None ,这就是为什么你会看到所有的无牌印刷品。如果不返回它,那么对于计算列表就无能为力,这使得整个函数变得毫无用处。我的建议是 print (list_) 具有 return list_ .