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

新手上路,请多包涵

我在没有 NumPy 的情况下在 Python 中完成了这个:

 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 只获取数组中的奇数。

原文由 Jennifer Crosby 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 830
2 个回答

干得好:

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

输出

[ 1  9 25]

Here, the operation a%2==1 returns a Boolean array array([ True, False, True, False, True, False], dtype=bool) which is True if the remainder/modulus after dividing by 2 (which is given通过 a%2 ) 值为 1False 如果它的 0 将其用作数组的参数 a 将仅返回 a 参数为“真”的值。这只会从 a 产生奇数。 ** 然后对这些奇数进行平方。如果您想要偶数,一种方法是将 a%2==0 放入您的条件中。

原文由 Sheldore 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

     mask = (arr % 2) == 1

运算符 == 将模运算的结果转换为布尔掩码:

     arr = arr[mask]

现在我们需要将剩余的 arr x 幂。如您所料,这就是 np.power 所做的:

     arr = np.power(arr, x)

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

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

原文由 Mad Physicist 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题