Python &引用;“正确”;与numpy对象交互的方法

Python &引用;“正确”;与numpy对象交互的方法,python,numpy,scientific-computing,Python,Numpy,Scientific Computing,我一直在断断续续地使用scientific python(通过pylab import*)作为免费的Matlab替代品,主要用于化学工程方面的工作(我是IPython笔记本的粉丝)。我总是觉得奇怪的是,通常有两种不同的方式与对象交互。例如,如果我有一个数组,我可以用两种方式来判断它的维数: a=数组([1,2,3],[2,3,4]) 有“Matlab”的方法: shape(a) 或者,我可以通过键入以下内容来查找: a.shape 这似乎与Python的禅宗格格不入:“应该有一种——最好只有一种

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

a=数组([1,2,3],[2,3,4])

有“Matlab”的方法:

shape(a)

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

a.shape

这似乎与Python的禅宗格格不入:“应该有一种——最好只有一种——显而易见的方法来做到这一点。”


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

使用这种方法更好。毕竟,
shape
的实现只是简单地服从于方法(从
/numpy/core/fromnumeric.py
):

我假设其中包含了很多pylab内容,以帮助来自MATLAB的人简化转换。习惯它吧,因为有更多的例子表明numpy是,嗯,不是很像蟒蛇


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

这主要取决于你的偏好,但也有一些差异,你可能需要注意。首先,您应该使用
numpy.shape(a)
np.shape(a)
而不是
shape(a)
,这是因为“名称空间是一个非常好的主意——让我们做更多的事情吧!”但实际上,numpy有几个名称,您可能会在其他python模块中找到,ie
array
在python stdlib中显示为
array.array
numpy.array
numpy.ma.array
,为了避免混淆其他人(和你自己),只需继续操作,避免导入整个numpy名称空间

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

def shape(a):
    try:
        result = a.shape
    except AttributeError:
        result = asarray(a).shape
    return result
如果您想要“类似于数组”的对象的形状,这可能非常有用,您会注意到大多数numpy函数都采用“类似于数组”的参数。但是,如果您正在执行以下操作,则速度可能会很慢:

shape = np.shape(list_of_lists)
mx = np.max(list_of_lists)
mn = np.min(list_of_lists)
除此之外,它们几乎是一样的

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