Python或Numpy方法MATLAB的“cellfun”

时间:2016-10-12 19:49:00

标签: python numpy elementwise-operations

是否存在类似于MATLABs“cellfun”的python或numpy方法?我想将一个函数应用于一个对象,该对象是一个MATLAB单元阵列,具有~300k不同长度的单元。

一个非常简单的例子:

>>> xx = [(4,2), (1,2,3)]
>>> yy = np.exp(xx)

Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
yy = np.exp(xx)
AttributeError: 'tuple' object has no attribute 'exp'

2 个答案:

答案 0 :(得分:4)

最易读/可维护的方法可能是使用list comprehension

yy = [ np.exp(xxi) for xxi in xx ]

依赖于numpy.exp隐式将每个元组转换为numpy.ndarray,这反过来意味着您将获得numpy.ndarray的列表,而不是列表元组。对于几乎所有目的而言,这可能是好的,但是如果你必须有元组也很容易安排:

yy = [ tuple(np.exp(xxi)) for xxi in xx ]

出于某些目的(例如,为了避免内存瓶颈),您可能更喜欢使用generator expression而不是列表理解(圆括号而不是方括号)。

答案 1 :(得分:2)

MATLAB细胞试图处理像真实语言这样的通用列表。但是作为MATLAB,他们必须是2d。但一般来说,在Python中使用MATLAB使用单元格的列表。具有numpy的{​​{1}}数组的行为类似,添加了多维数。

采用对象数组路由,我可以使用dtype=object将此函数应用于列表或数组的元素:

frompyfunc

在第二种情况下,结果是(2,2),在第一(2)形状中。这是因为In [231]: np.frompyfunc(np.exp,1,1)([(4,2),(1,2,3)]) Out[231]: array([array([ 54.59815003, 7.3890561 ]), array([ 2.71828183, 7.3890561 , 20.08553692])], dtype=object) In [232]: np.frompyfunc(np.exp,1,1)([(4,2),(1,2)]) Out[232]: array([[54.598150033144236, 7.3890560989306504], [2.7182818284590451, 7.3890560989306504]], dtype=object) 如何处理这两个输入。

列表理解同样快,并且可能提供更好的控制。或者至少可以更加可预测。