天天看點

numpy的深複制與淺複制的差別_Python資料分析之NumPy(基礎篇)

numpy的深複制與淺複制的差別_Python資料分析之NumPy(基礎篇)

Numpy 是 Python 的一個科學計算包,包含了多元數組以及多元數組的操作

關于Numpy需要知道的幾點:

  • NumPy 數組在建立時有固定的大小,不同于Python清單(可以動态增長)。更改ndarray的大小将建立一個新的數組并删除原始資料。
  • NumPy 數組中的元素都需要具有相同的資料類型,是以在存儲器中将具有相同的大小。數組的元素如果也是數組(可以是 Python 的原生 array,也可以是 ndarray)的情況下,則構成了多元數組。
  • NumPy 數組便于對大量資料進行進階數學和其他類型的操作。通常,這樣的操作比使用Python的内置序列可能更有效和更少的代碼執行。

ndarray的記憶體結構

Numpy 的核心是

ndarray

對象,這個對象封裝了同質資料類型的n維數組。起名 

ndarray

 的原因就是因為是 

n-dimension-array

 的簡寫。

我們來看一下

ndarray

如何在記憶體中儲存的:關于數組的描述資訊儲存在一個資料結構中,這個結構引用兩個對象,一塊用于儲存資料的存儲區域和一個用于描述元素類型的

dtype

對象。

numpy的深複制與淺複制的差別_Python資料分析之NumPy(基礎篇)

資料存儲區域儲存着數組中所有元素的二進制資料,

dtype

對象則知道如何将元素的二進制資料轉換為可用的值。數組的維數、大小等資訊都儲存在

ndarray

數組對象的資料結構中。

strides

中儲存的是當每個軸的下标增加1時,資料存儲區中的指針所增加的位元組數。例如圖中的

strides

為12,4,即第0軸的下标增加1時,資料的位址增加12個位元組:即a[1,0]的位址比a[0,0]的位址要高12個位元組,正好是3個單精度浮點數的總位元組數;第1軸下标增加1時,資料的位址增加4個位元組,正好是單精度浮點數的位元組數。

Numpy數組初始化

可以調用np.array去從list初始化一個數組:

一些内置的建立數組的函數

Numpy數組資料類型

我們可以用dtype來看numpy數組中元素的類型:

使用astype複制數組并轉換資料類型

使用astype将float轉換為int時小數部分被舍棄

使用astype把字元串轉換為數組,如果失敗抛出異常。

astype使用其它數組的資料類型作為參數

Numpy的複制和視圖

當計算和操作數組時,它們的資料有時被複制到新的數組中,有時不複制。這裡我們做個區分。

完全不複制

簡單指派不會建立數組對象或其資料的拷貝。

視圖或淺複制

不同的數組對象可以共享相同的資料。

view

方法建立一個新數組對象,該對象看到相同的資料。與前一種情況不同,新數組的維數更改不會更改原始資料的維數,但是新數組資料更改後,也會影響原始資料。

深複制

copy

方法生成數組及其資料的完整拷貝。

Numpy數組取值和指派

切片

多元數組可以從各個次元同時切片

自由地取值群組合

用條件判定去取值

總結

numpy的深複制與淺複制的差別_Python資料分析之NumPy(基礎篇)
numpy的深複制與淺複制的差別_Python資料分析之NumPy(基礎篇)

參考

[numpy指南]http://docs.scipy.org/doc/numpy/reference/

[numpy ndarray詳解]https://danzhuibing.github.io/py_numpy_ndarray.html

[NumPy-快速處理資料]http://old.sebug.net/paper/books/scipydoc/numpy_intro.html

numpy的深複制與淺複制的差別_Python資料分析之NumPy(基礎篇)