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

时间:2013-10-23 00:43:05

标签: python numpy scientific-computing

我一直在使用科学python(通过from pylab import *)作为免费的Matlab替代品开启和关闭一段时间,主要用于化学工程(我是IPython笔记本的粉丝)。对我来说总是显得很奇怪的事实是,通常有两种不同的方式与对象进行交互。例如,如果我有一个数组,我可以通过两种方式告诉它的维度:

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

有'Matlab'方式:

shape(a)

或者我可以通过输入:

找到它

a.shape

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

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

2 个答案:

答案 0 :(得分: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风格的工作。

答案 1 :(得分:3)

这主要归结为偏好问题,但您可能希望了解一些差异。首先,您应该使用numpy.shape(a)np.shape(a)而不是shape(a),这是因为“命名空间是一个很棒的主意 - 让我们做更多这些!”但实际上,numpy有几个你可能在其他python模块中找到的名字,即array在python stdlib,array.arraynumpy.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)

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