将一个精心制定的标准作为 Python 中的第一类对象传递给内部 np.where() 调用



如何使它成为动态或第一类函数,本质上将条件传递给 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的方式来表述问题/获得答案,那么欢迎贡献。

谢谢。

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

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

最新更新