将完善的标准作为Python中的第一类对象传递给内部np.where()调用?

时间:2014-03-02 19:11:33

标签: python python-2.7 numpy

如何使这个动态或第一类函数基本上将标准传递给np.where()调用?

def num_assets(obj, criteria=None):
    """
    A flexible wrapper to return the number of assets in a portfolio.

    # list (asset names or characteristics)
    >>> num_assets([1, 2, 3, 4, 5])
    5

    # number (pre-specification)
    >>> num_assets(7)
    7

    # column vector (weights)
    >>> num_assets(np.zeros(shape=(3,1)))
    3

    # matrix (covariance matrix)    
    >>> num_assets(np.eye(10))    
    10

    # criteria.
    >>> num_assets([1, 2, 3, 4, 5], '> 3')
    ??? I AM STUCK HERE AND NEED SOME HELP! Should return 2
    """
    if criteria is None:
        if myc.is_iterable(obj):
            shape_obj = np.shape(obj)
            return max(shape_obj)
        elif myc.is_number(obj):
            return myc.is_number(obj, True)
    else:
        return np.where(criteria)

myc.is_iterable()本质上是一个布尔函数,包含一个try except子句,告诉我obj是否可迭代。 myc.is_number()告诉我obj是否是一个数字,当我传递True参数时,它解析数字(如果obj是一个字符串)。我认为自己是一个新手并且知道这不应该是一个难以解决的问题,只是因为我不确定我需要应用什么高级Python来解决标准类型问题(第一类对象,元编程,。 ..)?此外,如果有一个更清洁,更pythonic的方式来制定问题/得到答案,贡献将是最受欢迎的。

感谢。

1 个答案:

答案 0 :(得分:2)

如果我理解你的意思,那么我认为这会做你想要的。

if criteria is None:
    what you already have
else:
    obj = np.asarray(obj)
    return np.sum(eval('obj'+criteria))

使用eval并不优雅,但我认为这是最简单的方法。对于criteria='>3'的示例,此变为np.sum(obj>3),即np.sum([False,False,False,True,True]),即2

}这里不需要where