是否存在类似于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'
答案 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)
如何处理这两个输入。
列表理解同样快,并且可能提供更好的控制。或者至少可以更加可预测。