2

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

import numpy as np
def f(a):
    if a<5:
        print a;
f(np.arange(11))

此代码返回错误:如果 a<5:

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我希望输出是:

0
1
2
3
4

我怎样才能让它按照我解释的方式工作,因为我相信许多 python 函数都以这种方式工作?

谢谢。

4

4 回答 4

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

一般来说,我不喜欢将打印语句放在函数中(除非函数除了打印什么都不做。)如果你将 I/O 与计算分开,那么你的函数将更具可重用性。


编写一个返回不同类型输出的函数通常也是一个坏主意,例如某些输入的标量和其他输入的数组。如果这样做,那么使用此函数的后续代码都必须检查输出是标量还是数组。或者,必须非常仔细地编写代码来控制向函数发送什么样的输入。如果您这样做,代码可能会变得非常复杂或非常错误。

编写简单的函数——要么总是返回一个数组,要么总是返回一个标量。

于 2013-03-31T14:30:11.367 回答
1

如果您希望函数根据给定的输入是一个列表还是一个 int 做出反应,请使用:

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

通过上述步骤,该函数检查给定输入是否为数组,如果条件为真,则使用第一个块。next if 块检查输入是否为 int。否则执行 else 块

于 2013-03-31T14:33:31.257 回答
1

当我不得不处理这种事情时,我通常首先在np.asarray开始时进行输入,如果它是 0 维(即标量)则设置一个标志,将其提升为 1 维,运行函数在数组上,如果设置了标志,则在返回之前将其转换回标量。以你为例:

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)

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

于 2013-03-31T19:33:29.593 回答
0

您可以使用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

通过这种方式,您可以创建一个执行正确操作的函数,无论它被赋予 a str、 a float、 an int、 alist还是 an numpy.ndarray

于 2013-03-31T14:30:42.493 回答