如何仅获取数组中的奇数并使用numpy为python平方它们?

时间:2018-07-31 15:50:24

标签: python numpy mod

我在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进行此操作,我不理解,也无法在网上找到太多有关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 个答案:

答案 0 :(得分:2)

您在这里:

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之后的余数/模数(由{{1}给出),则返回布尔数组2。 })的值为a%2,如果值为1,则为False。将其用作数组0的参数将仅返回参数为'True'的a值。这仅从a中产生奇数。然后a将这些奇数平方。如果您想要偶数,一种方法是将**置于您的状态。

答案 1 :(得分:1)

numpy的强大之处在于它使您可以在单个操作中对整个阵列进行操作。这称为矢量化或矢量化。当然,有很多循环可以执行此操作,但是它们是用C语言编写的并且经过高度优化,因此它们的运行速度比纯python所能达到的速度快。

因此,当您使用numpy编写函数时,您的首要目标是让numpy完成所有工作。理想情况下,不应有任何显式循环,而应仅对整个阵列一次进行操作。幸运的是,numpy提供了所有必要的实用程序,以使您的情况成为可能。

这是逐步指南,然后:

首先,将您的输入转换为数组。数组在许多方面都类似于列表,不同之处在于您可以对它们执行矢量化操作。如果您传入列表,大多数numpy函数都会将其输入默默地转换为数组,但是我们会明确地做到这一点:

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

到目前为止,一切都很好。将对arr而不是list_进行所有进一步的操作。

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

>>> 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]

现在,我们需要将其余arr的每个元素提高到幂x。如您所料,np.power就是这样做的:

    arr = np.power(arr, x)

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

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