我想知道是否有人能够将一个python列表,一个numpy向量(shape(n,))或一个numpy向量(shape(n,1))传递给一个函数。我们的想法是概括一个函数,使三者中的任何一个都有效,而不会增加复杂性。
初步想法:
1) Use a type checking decorator function and cast to a standard representation.
2) Add type checking logic inline (significantly less ideal than #1).
3) ?
我一般不使用python内置数组类型,但怀疑这个问题的解决方案也会支持这些。
答案 0 :(得分:3)
我认为最简单的方法是使用numpy.atleast_2d
启动您的功能。然后,所有3种可能性都将转换为x.shape == (n, 1)
情况,您可以使用它来简化您的功能。
例如,
def sum(x):
x = np.atleast_2d(x)
return np.dot(x, np.ones((x.shape[0], 1)))
atleast_2d
会返回该数组的视图,因此如果您传入的内容已经是ndarray
,则不会有太大的开销。但是,如果您打算修改x
并因此想要制作副本,则可以执行x = np.atleast_2d(np.array(x))
。
答案 1 :(得分:2)
您可以使用以下命令将这三种类型转换为“规范”类型,即1dim数组:
arr = np.asarray(arr).ravel()
加入装饰者:
import numpy as np
import functools
def takes_1dim_array(func):
@functools.wraps(func)
def f(arr, *a, **kw):
arr = np.asarray(arr).ravel()
return func(arr, *a, **kw)
return f
然后:
@takes_1dim_arr
def func(arr):
print arr.shape