1

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

一个非常简单的例子:

>>> 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'
4

2 回答 2

5

最易读/可维护的方法可能是使用列表理解

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

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

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

出于某些目的(例如,为了避免内存瓶颈),您可能更喜欢使用生成器表达式而不是列表推导式(圆括号而不是方括号)。

于 2016-10-12T19:57:05.447 回答
2

MATLAB 单元试图像处理真实语言一样处理一般列表。但是作为 MATLAB,它们必须是 2d 的。但总的来说,在 Python 中使用列表,而 MATLAB 使用单元格。 numpy具有类似行为的数组dtype=object,添加了多维。

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

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)

在第二种情况下,结果是 (2,2),在第一个 (2,) 形状中。那是因为如何np.array([...])处理这两个输入。

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

于 2016-10-12T20:41:17.543 回答