如何使它成为动态或第一类函数,本质上将条件传递给 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
。