我已经看到一些python函数通常接收(n,2)形numpy ndarray作为参数,但也可以“自动”接收(2,n)或甚至len(2)序列(元组或列表)。
如何实现蟒蛇术?是否有统一的良好实践来检查和处理这些案例(例如,numpy和scipy模块中的函数),或者每个开发人员实现他认为最好的情况?
我只想避免使用ifs / elifs链(可能是嵌套的)链,以防有一个众所周知的更好的方法。
感谢您的帮助。
答案 0 :(得分:6)
您可以使用numpy.asarray函数将任何类似序列的输入转换为数组:
>>> import numpy
>>> numpy.asarray([1,2,3])
array([1, 2, 3])
>>> numpy.asarray(numpy.array([2,3]))
array([2, 3])
>>> numpy.asarray(1)
array(1)
>>> numpy.asarray((2,3))
array([2, 3])
>>> numpy.asarray({1:3,2:4})
array({1: 3, 2: 4}, dtype=object)
重要的是要注意,正如文档所说如果输入已经是ndarray ,则不执行复制。这非常好,因为你可以传入一个现有的数组,它只返回相同的数组。
将它转换为numpy数组后,只需检查长度是否符合要求即可。类似的东西:
>>> def f(x):
... x = numpy.asarray(x)
... if len(x) != 2:
... raise Exception("invalid argument")
...
>>> f([1,2])
>>> f([1,2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in f
Exception: invalid argument
<强>更新强> 既然你问过,这里有一个“魔术”函数,除了* args作为一个数组之外:
>>> def f(*args):
... args = numpy.asarray(args[0]) if len(args) == 1 else numpy.asarray(args)
... return args
...
>>> f(7,3,5)
array([7, 3, 5])
>>> f([1,2,3])
array([1, 2, 3])
>>> f((2,3,4))
array([2, 3, 4])
>>> f(numpy.array([1,2,3]))
array([1, 2, 3])