我一直在使用科学python(通过from pylab import *
)作为免费的Matlab替代品开启和关闭一段时间,主要用于化学工程(我是IPython笔记本的粉丝)。对我来说总是显得很奇怪的事实是,通常有两种不同的方式与对象进行交互。例如,如果我有一个数组,我可以通过两种方式告诉它的维度:
a = array([1,2,3],[2,3,4])
有'Matlab'方式:
shape(a)
或者我可以通过输入:
找到它 a.shape
这似乎与Python的禅宗相矛盾:“应该有一个 - 最好只有一个 - 显而易见的方法”
我只是想知道为什么有多种方法可以做同样的事情,哪种做法对语言来说更基本/更自然,从长远来看会更好用。
答案 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.array
和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)
除此之外,它们几乎相同。