【问题标题】:How to get only odd numbers in array and square them using numpy for python?python - 如何使用numpy for python仅获取数组中的奇数并将它们平方?
【发布时间】:2018-07-31 15:50:24
【问题描述】:

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

【问题讨论】:

  • 请正确缩进你的函数。 Python 对空格非常敏感。
  • 请教我你应该如何看待它如何?我没有收到任何错误。谢谢!
  • 如果我将您的第一个 sn-p 粘贴到我的控制台中,我会收到缩进错误。考虑将所有代码缩进 4 个空格,而不仅仅是第一行。

标签: python numpy mod


【解决方案1】:

给你:

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

输出

[ 1  9 25]

这里,如果除以2(由a%2给出)后的余数/模数是1和@987654329,则操作a%2==1返回一个布尔数组array([ True, False, True, False, True, False], dtype=bool),即True @如果是0。将其用作数组a 的参数将仅返回参数为“True”的a 值。这只会产生来自a 的奇数。然后** 将这些奇数平方。如果您想要偶数,一种方法是将a%2==0 放在您的条件中。

【讨论】:

  • OP显然是一个正在努力的初学者。请解释您的代码,而不是仅仅交出一个未记录的解决方案。
  • OP 可能是初学者,但还不够天真,无法逐行分解代码(与答案一样简洁)以查看输出。抱歉,我不相信用勺子喂食。除了返回布尔数组的a%2==1,我看不到任何值得澄清的地方。而且OP似乎知道%和==
  • 我的意思是,你正在做的是最糟糕的勺子喂养方式。提供一段未记录但可以工作的代码是让人们停止提问并只是复制和粘贴的好方法。
  • 即使你不解释是什么,在我看来解释为什么是非常重要的。没有人能读懂你的心思。他们只能看到你做了什么。
  • 我同意我可以本着初学者的精神添加一个小解释,但是然后写“使用 NumPy,我不明白,在网上找不到太多关于它的信息”是这样的至少今天是不可能消化的。不过不管怎样,下次我会记住的
【解决方案2】:

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_。

【讨论】:

  • 我正试图弄清楚这个面具的事情。我明白了这个概念,但从技术上讲,我在运行之前不知道数组中的值,因此无法手动执行您在这里的操作。我需要一个我认为的 where 语句。我发现了这一点,但我没有正确实施它。 docs.scipy.org/doc/numpy/reference/generated/…。 ` import math import numpy.ma as ma a=np.array([array_]) pwr=x ma.masked_where(a%2!=0, True) ma.masked_where(a%2==0, False) a= np.power(a,pwr) 返回 (a)`
  • @JenniferCrosby。你太复杂了。一旦你弄清楚它们是如何工作的,面具就会非常简单,而且根据我的经验,大多数时候你不需要像where 这样的函数来应用它们。看看我的例子&gt;&gt;&gt;,然后记住(arr % 2) == 1 是一个从arr 中选择奇数元素的布尔掩码。如果你只是做arr[mask],你最终会得到一个只包含奇数元素的数组,因为这就是你制作掩码的方式。完成每一步。先看arr % 2,再看(arr % 2) == 1,再看arr[(arr % 2) == 1]。
  • 如果你在我的代码中合并所有缩进的行(不包括带有&gt;&gt;&gt;的行,你会得到你正在寻找的确切函数)。
【解决方案3】:

将 numpy 导入为 np def my_fun(a): arr_1=np.array(a) 打印(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2019-04-18
    • 2018-05-09
    • 1970-01-01
    相关资源
    最近更新 更多