我在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获取数组中的奇数。
答案 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_
。