Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编写一个函数来逐个元素地处理数组作为输入并返回数组_Python_Function_Numpy_Iteration - Fatal编程技术网

Python 如何编写一个函数来逐个元素地处理数组作为输入并返回数组

Python 如何编写一个函数来逐个元素地处理数组作为输入并返回数组,python,function,numpy,iteration,Python,Function,Numpy,Iteration,我正在尝试编写一个函数,我希望它在输入为元素时返回一个元素,如果输入为数组,则返回一个输出数组,这样输出数组的每个元素都与输入数组中的相同位置相关联。我举一个假例子: import numpy as np def f(a): if a<5: print a; f(np.arange(11)) 我相信很多python函数都是以这种方式工作的,我如何才能使它按照我解释的方式工作呢 谢谢。将numpy作为np导入 import numpy as np def f(a):

我正在尝试编写一个函数,我希望它在输入为元素时返回一个元素,如果输入为数组,则返回一个输出数组,这样输出数组的每个元素都与输入数组中的相同位置相关联。我举一个假例子:

import numpy as np
def f(a):
    if a<5:
        print a;
f(np.arange(11))
我相信很多python函数都是以这种方式工作的,我如何才能使它按照我解释的方式工作呢

谢谢。

将numpy作为np导入
import numpy as np
def f(a):
    result = a[a<5]
    return result

def report(arr):
    for elt in arr:
        print(elt)

report(f(np.arange(11)))
定义f(a):
result=a[a您可以使用
isinstance
检查参数的类型,然后让函数执行正确的操作

In [15]: a = np.arange(11)

In [16]: isinstance(a, np.ndarray)
Out[16]: True

In [17]: b = 12.7

In [18]: isinstance(b, float)
Out[18]: True

In [19]: c = 3

In [20]: isinstance(c, int)
Out[20]: True

In [21]: d = '43.1'

In [23]: isinstance(d, str)
Out[23]: True

In [24]: float(d)
Out[24]: 43.1

In [25]: float('a3')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-caad719e0e75> in <module>()
----> 1 float('a3')

ValueError: could not convert string to float: a3
[15]中的
:a=np.arange(11)
在[16]中:存在(a,np.ndarray)
Out[16]:对
在[17]中:b=12.7
在[18]中:isinstance(b,float)
Out[18]:对
In[19]:c=3
In[20]:i实例(c,int)
Out[20]:对
在[21]中:d='43.1'
在[23]中:isinstance(d,str)
Out[23]:对
In[24]:浮点数(d)
Out[24]:43.1
在[25]中:浮动('a3')
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1浮点数('a3')
ValueError:无法将字符串转换为浮点:a3

通过这种方式,无论给定的函数是
str
float
int
list
还是
numpy.ndarray
,如果希望函数根据给定的输入是list还是int做出反应,请使用:

def f(a):
    if type(a)==type([]):
        #do stuff
    elif type(a)==type(5):
        #do stuff
    else
        print "Enter an int or list"

通过上面的步骤,函数检查给定的输入是否是数组,如果条件为true,则使用第一个块。接下来,if块检查输入是否是int。否则执行Else块。当我不得不处理此类事情时,我通常在开始时对输入执行
np.asarray
,设置如果是0维(即标量),则标记,将其提升为1-D,在数组上运行函数,并在返回之前将其转换回标量(如果设置了标记)。例如:

def f(a):
    a = np.asarray(a)
    is_scalar = False if a.ndim > 0 else True
    a.shape = (1,)*(1-a.ndim) + a.shape
    less_than_5 = a[a < 5]
    return (less_than_5 if not is_scalar else
            (less_than_5[0] if less_than_5 else None))

>>> f(4)
4
>>> f(5)
>>> f([3,4,5,6])
array([3, 4])
>>> f([5,6,7])
array([], dtype=int32)
def(a):
a=np.asarray(a)
如果a.ndim>0,则为\u scalar=False,否则为True
a、 形状=(1,)*(1-a.ndim)+a.shape
小于等于a[a<5]
返回值(如果不是,则小于5)
(如果小于5,则小于5[0],否则无)
>>>f(4)
4.
>>>f(5)
>>>f([3,4,5,6])
数组([3,4])
>>>f([5,6,7])
数组([],dtype=int32)

如果经常这样做,可以在函数装饰器中添加所有处理。

错误消息很清楚。如果a@DanielRoseman,我编辑了我的代码。我真的想知道为什么这次我投了反对票?!!正如我在问题中所说的,这是一个虚拟体,只是为了举例说明。在我的原始代码中,我没有任何printing、 你解决这个问题的方法是针对具体问题的。我试图弄清楚python或numpy函数在不知道输入形状的情况下是如何处理这种情况的。通常numpy数组是这样写的,因为它们通常处理矩阵!我的情况几乎是一样的!你能给出一个numpy函数的例子吗t的行为是这样的吗?如果你给(2,[3,3]),那么np.dot(5,3)返回15。它将返回[6,6]我怀疑
np.dot
正在调用
np.asarray
关于它的参数来将所有内容提升为数组,然后使用广播将数组提升为相等的形状。即使
np.dot(5,3)
返回一个标量,如果您在代码中执行这种操作,则表明您误用了NumPy。
np.dot(5,3)
5*3
慢250倍。谢谢。这会起作用,但我想知道这是内置函数或例如numpy函数处理此类情况的方式吗?这是检查我们是否不知道收到的输入类型的方式
def f(a):
    a = np.asarray(a)
    is_scalar = False if a.ndim > 0 else True
    a.shape = (1,)*(1-a.ndim) + a.shape
    less_than_5 = a[a < 5]
    return (less_than_5 if not is_scalar else
            (less_than_5[0] if less_than_5 else None))

>>> f(4)
4
>>> f(5)
>>> f([3,4,5,6])
array([3, 4])
>>> f([5,6,7])
array([], dtype=int32)