我主要使用numpy進行數據分析,不太瞭解底層程序,所以這可能是顯而易見的。設置屬性和調用就地變異方法之間的區別?
我不明白設置一個屬性,通過簡單地分配它與調用一個方法,就地改變該屬性之間的差異。在這裏你都可以做的例子是:
In [1]: import numpy as np
In [2]: a = np.array([[1, 2, 3],
...: [4, 5, 6]])
In [3]: a.shape
Out[3]: (2, 3)
In [4]: a.reshape(3,2)
Out[4]:
array([[1, 2],
[3, 4],
[5, 6]])
In [5]: a
Out[5]:
array([[1, 2, 3],
[4, 5, 6]])
In [6]: a.resize(3,2)
In [7]: a
Out[7]:
array([[1, 2],
[3, 4],
[5, 6]])
In [8]: a.shape = (6,)
In [9]: a
Out[9]: array([1, 2, 3, 4, 5, 6])
In [10]: a.__setattr__('shape',(3,2))
In [11]: a
Out[11]:
array([[1, 2],
[3, 4],
[5, 6]])
我不明白有什麼區別投入6
和8
之間。顯然,兩者都改變了a.shape
屬性,而不是像4
那樣返回重構對象。他們都只需撥打a.__setattr__()
,如10
?如果是這樣,爲什麼他們都存在?
(我知道a.resize()
有額外的能力來增加或減少分配的內存,但我沒有使用,在這裏---這是否口是心非只與方法存在增加了一些其他身份?)
看看源代碼:http://github.com/numpy/numpy/blob/v1.7.0/numpy/core/fromnumeric.py#L108 – Blender 2013-02-21 01:05:27
我想我實際上需要'def resize'這一行: https://github.com/numpy/numpy/blob/v1.7.0/numpy/core/fromnumeric.py#L817 – askewchan 2013-02-21 01:07:18
這兩個來源都是用於獨立'numpy'函數的,它們的行爲完全可以理解。這是我不明白的方法與設置屬性。它可能隱藏在[''c源代碼](https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/shape.c),但我不知道如何將'c'代碼翻譯成'class'屬性如何改變。 – askewchan 2013-02-21 02:25:38