与numpy对象交互的“正确”方式

2024-09-30 16:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经断断续续地使用科学python(viafrom pylab import *)作为免费的Matlab替代品,主要用于化学工程方面的工作(我是IPython笔记本的粉丝)。我一直觉得奇怪的是,与一个对象交互通常有两种不同的方式。例如,如果我有一个数组,我可以用两种方法来判断它的维数:

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

有一种“Matlab”方法:

shape(a)

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

a.shape

这似乎与Python的禅相矛盾:“应该有一种——最好只有一种——显而易见的方法。”

我只是想知道为什么做同一件事有多种方法,哪种练习对语言更基本/更自然,从长远来看更适合使用。在


Tags: 对象方法import替代品ipython方式笔记本科学
2条回答

这主要归结为一个偏好问题,但有一些差异,你可能想知道。首先,您应该使用numpy.shape(a)np.shape(a),而不是shape(a),这是因为“名称空间是一个非常好的主意,让我们做更多这些!”但实际上,numpy有几个名称,您可能会在其他python模块中找到,即array在python stdlib中显示为array.arraynumpy.array和{},所以为了避免混淆其他人(和您自己),只需继续并避免导入整个numpy名称空间。在

除此之外,numpy.shape和大多数其他类似的函数,只需在参数上查找一个shape属性/方法,如果找不到,则尝试将参数转换为数组。代码如下:

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

如果你想要一个“类似数组”的对象的形状,这很有用,你会注意到大多数numpy函数都有“类似数组”的参数。但如果你做的事情像:

^{pr2}$

除此之外,它们几乎是一样的。在

最好使用这种方法。毕竟,shape的实现无论如何都要服从于方法(来自/numpy/core/fromnumeric.py):

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

我想很多pylab的东西都是为了帮助那些来自MATLAB的人简化过渡。习惯它吧,因为有很多新的例子,嗯,不是很像Python。在

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

相关问题 更多 >