3

我一直在使用科学 python (via from pylab import *) 作为免费的 Matlab 替代品,主要用于化学工程(我是 IPython Notebook 的粉丝)。我总是觉得奇怪的是,通常有两种不同的方式与对象交互。例如,如果我有一个数组,我可以通过两种方式来判断它的维度:

a = array([1,2,3],[2,3,4])

有'Matlab'方式:

shape(a)

或者,我可以通过键入以下内容找到它:

a.shape

这似乎与 Python 的禅宗相矛盾:“应该有一种——最好只有一种——明显的方式来做到这一点”

我只是想知道为什么有多种方法可以做同样的事情,哪种做法对语言来说更基础/更自然,从长远来看会更好。

4

2 回答 2

4

最好使用该方法。毕竟,shape无论如何(从)简单地执行方法/numpy/core/fromnumeric.py

def shape(a):
    try:
        result = a.shape
    except AttributeError:
        result = asarray(a).shape
    return result

我假设很多这些 pylab 的东西只是为了帮助来自 MATLAB 的人简化过渡。习惯它,因为还有更多numpy 的例子,嗯,不是很 Pythonic。

当你更习惯于 python 和 matplotlib 时,你可能会想要放弃这些from pylab import *,开始编写更多的 numpythonic 代码,而不是 MATLAB 风格的工作。

于 2013-10-23T00:49:55.790 回答
3

它主要归结为偏好问题,但您可能需要注意一些差异。首先,您应该使用numpy.shape(a)ornp.shape(a)而不是shape(a),那是因为“命名空间是一个很棒的想法——让我们做更多的事情!” 但实际上,numpy 有几个您可能会在其他 python 模块中找到的名称,即array出现array.array在 python stdlib 中,numpy.array并且numpy.ma.array,因此为了避免混淆其他(和您自己),请继续并避免导入整个 numpy 命名空间。

除此之外,事实证明numpy.shape,和大多数其他类似的函数,只是在参数上查找形状属性/方法,如果找不到,他们会尝试将参数转换为数组。这是代码:

def shape(a):
    try:
        result = a.shape
    except AttributeError:
        result = asarray(a).shape
    return result

如果您想要“array_like”对象的形状,这可能很有用,您会注意到大多数 numpy 函数都采用“array_like”参数。但如果你正在做类似的事情,它可能会很慢:

shape = np.shape(list_of_lists)
mx = np.max(list_of_lists)
mn = np.min(list_of_lists)

除此之外,它们几乎相同。

于 2013-10-23T00:58:16.937 回答