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

How to get only odd numbers in array and square them using numpy for python?

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

给你:

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 return 是一个布尔数组 array([ True, False, True, False, True, False], dtype=bool) 如果 remainder/modulus 除以 2 (由 a%2) 给出的值是 1False 如果它的 0。将其用作数组 a 的参数将 return 只有参数为 'True' 的 a 值。这只会从 a 中产生奇数。 ** 然后对这些奇数进行平方。如果您想要偶数,一种方法是将 a%2==0 放入您的条件中。

numpy 的强大之处在于它允许您在一次操作中对整个数组进行操作。这称为矢量化或向量化。当然,在引擎盖下有循环来执行此操作,但它们是用 C 语言编写的并经过高度优化,因此它们 运行 数量级比您使用纯 python.[=24 可以实现的任何速度都快=]

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

下面是分步指南:

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

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

到目前为止一切顺利。所有进一步的操作都将对 arr 而不是 list_.

进行

接下来您需要过滤掉偶数元素。最简单的方法是屏蔽数组。当您使用相同大小的布尔数组索引 numpy 数组时,它将 select 布尔数组中为 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)

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

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

将 numpy 导入为 np def my_fun(a): arr_1=np.array(一) 打印(arr_1)

## even and odd elements fetching in two diff matrix
[l,b]=np.shape(arr_1)
print(l,b)
for key1 in range(0,l):
    for key2 in range(0,b):
        if arr_1[key1,key2]%2==0:
            idx_div_zero=([key1,key2])
            prop_format=tuple(idx_div_zero)
            arr_1[prop_format]=0
        if arr_1[key1,key2]%2!=0:
            ff=([key1,key2])
            prop_fmt_nz=tuple(ff)
            arr_1[prop_fmt_nz]=1
print(arr_1)