2014-09-25 65 views
1

我是Python和OOP概念的新手,我无法理解某些东西,比如为什么某些函数会改变原始对象而有些则不会。为了更好地理解它,我在下面的代码片段中将注意力放在了混淆之处。任何帮助表示赞赏。谢谢。对象在Python中更改

from numpy import * 
a = array([[1,2,3],[4,5,6]],float) 
print a 
array([[ 1., 2., 3.], 
     [ 4., 5., 6.]]) ### Result reflected after using print a 
a.reshape(3,2) 
array([[ 1., 2.], 
     [ 3., 4.], 
     [ 5., 6.]]) ### Result reflected on IDE after applying the reshape function 
print a 
array([[ 1., 2., 3.], 
     [ 4., 5., 6.]]) ### It remains the same as original value of "a", which is expected. 
a.fill(0) 
print a 
[[ 0. 0. 0.] 
[ 0. 0. 0.]] ### It changed the value of array "a" , why? 

############# 
type(reshape) ### If i try to find the type of "reshape" , i get an answer as "function" . 
<type 'function'> 

type(fill) ### I get a traceback when i try to find type of "fill", why? 
Traceback (most recent call last): 
    File "<pyshell#12>", line 1, in <module> 
    type(fill) 
NameError: name 'fill' is not defined 

我的问题是:

1)我要如何知道哪些功能(S)(考虑“补”是一个功能)将改变我原来的对象值(在我情况下它的“a”)?如果“fill”是一个函数,那么为什么它改变了对象“a”的原始值?

3)为什么我使用类型(填充)时得到回溯?

+1

给定函数可以改变或者不是对象输入对象值。在NumPy中,许多函数都带有'out'参数,它告诉函数将答案放在这个对象中... – 2014-09-25 09:53:23

+0

@Saullo Castro,谢谢你的回复,如果是这样的话,对于像我这样的人来说,是新的),学习如何知道哪个函数有“out”参数,谁没有,有没有看到它,或者在学习语言后变得直观。顺便说一下,“out”参数是什么? – PKumar 2014-09-25 10:02:42

+1

[检查np.multiply](http://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html)函数,例如...并查看'out'参数 – 2014-09-25 10:07:28

回答

1

给定的函数可以改变或不改变输入对象。在NumPy中,许多函数都带有一个out参数,它告诉函数将答案放在此对象中。

下面是一些 NumPy的功能与out参数:

可能发生的是,这些功能可作为一个ndarray方法而不out参数,在这种情况下,代替执行所述操作。也许最有名的是:

的一些功能和方法不使用out参数,返回一个内存视图时参考:

  • 功能np.reshape()和方法ndarray.reshape()

The ndarray.fill()是作为方法专门提供的子例程的一个示例,它在原地更改数组。


每当你得到一个ndarray对象或它的子类,可以检查它是否是一个存储视图或不基于flags属性的OWNDATA条目:

print(a.flags) 

C_CONTIGUOUS : True 
F_CONTIGUOUS : False 
OWNDATA : True 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False 
+0

哇!感谢Owndata和flags属性。 – PKumar 2014-09-25 10:59:31

1
  1. 阅读docs或尝试:)

  2. a.reshape()是()对象的方法,对相同a.fill。它可以做任何事情。这不适用于重塑(不是a.reshape) - 这是您从从numpy结节导入的函数。

  3. 填充不在numpy模块中(您尚未导入它),它是ndarray对象的成员。