1. 程式人生 > >Python-Numpy多維陣列--概述,資料型別物件,陣列的屬性,陣列的建立流程

Python-Numpy多維陣列--概述,資料型別物件,陣列的屬性,陣列的建立流程

一、Numpy概述

         Numpy 是一個 Python 包(Numeric Python)。它是一個由多維陣列物件和用於處理陣列的集合組成的庫。 Numpy 擁有線性代數和隨機數生成的內建函式。Numpy 通常與 SciPy(Scientific Python)和 Matplotlib(繪相簿)一起使用。這種組合廣泛用於替代 MatLab,是一個流行的技術計算平臺。 但是,Python 作為 MatLab 的替代方案,現在被視為一種更加現代和完整的程式語言。NumPy 是開源的,這是它的一個額外的優勢。使用Numpy,開發人員可以執行以下操作:

  • 陣列的算數和邏輯運算。

  • 傅立葉變換和用於圖形操作的例程。

  • 與線性代數有關的操作。

二、Numpy - ndarray 物件

Numpy 中定義的最重要的物件是稱為 ndarray 的 N 維陣列型別。 它描述相同型別的元素集合。 可以使用基於零的索引訪問集合中的專案。ndarray中的每個元素在記憶體中使用相同大小的塊。 ndarray中的每個元素是資料型別物件的物件(稱為 dtype)。

ndarray物件提取的任何元素(通過切片)由一個數組標量型別的 Python 物件表示。 下圖顯示了ndarray

,資料型別物件(dtype)和陣列標量型別之間的關係。

Ndarray

 

ndarray類的例項可以通過本教程後面描述的不同的陣列建立例程來構造。 基本的ndarray是使用 NumPy 中的陣列函式建立的,如下所示:

numpy.array 

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

上面的構造器接受以下引數:

序號 引數及描述
1. object 任何暴露陣列介面方法的物件都會返回一個數組或任何(巢狀)序列。
2. dtype 陣列的所需資料型別,可選。
3. copy 可選,預設為true,物件是否被複制。
4. order C(按行)、F(按列)或A(任意,預設)。
5. subok 預設情況下,返回的陣列被強制為基類陣列。 如果為true,則返回子類。
6. ndimin 指定返回陣列的最小維數。

DEMO 1

import numpy as np
a = np.array([1,2,3])
print a
# 輸出如下:[1, 2, 3]

DEMO 2

# 多於一個維度
import numpy as np
a = np.array([[1, 2], [3, 4]])
print a
# 輸出如下:[[1, 2] 
         # [3, 4]]

DEMO 3

# 最小維度
import numpy as np
a = np.array([1, 2, 3,4,5], ndmin = 2)
print a
# 輸出如下:[[1, 2, 3, 4, 5]]

DEMO 4

# dtype 引數
import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print a
# 輸出如下:[ 1.+0.j, 2.+0.j, 3.+0.j]

**ndarray ** 物件由計算機記憶體中的一維連續區域組成,帶有將每個元素對映到記憶體塊中某個位置的索引方案。 記憶體塊以按行(C 風格)或按列(FORTRAN 或 MatLab 風格)的方式儲存元素。

三、Numpy 的資料型別

Numpy 支援比 Python 更多種類的數值型別。

序號 資料型別及描述
1. bool_ 儲存為一個位元組的布林值(真或假)
2. int_ 預設整數,相當於 C 的long,通常為int32int64
3. intc 相當於 C 的int,通常為int32int64
4. intp 用於索引的整數,相當於 C 的size_t,通常為int32int64
5. int8 位元組(-128 ~ 127)
6. int16 16 位整數(-32768 ~ 32767)
7. int32 32 位整數(-2147483648 ~ 2147483647)
8. int64 64 位整數(-9223372036854775808 ~ 9223372036854775807)
9. uint8 8 位無符號整數(0 ~ 255)
10. uint16 16 位無符號整數(0 ~ 65535)
11. uint32 32 位無符號整數(0 ~ 4294967295)
12. uint64 64 位無符號整數(0 ~ 18446744073709551615)
13. float_ float64的簡寫
14. float16 半精度浮點:符號位,5 位指數,10 位尾數
15. float32 單精度浮點:符號位,8 位指數,23 位尾數
16. float64 雙精度浮點:符號位,11 位指數,52 位尾數
17. complex_ complex128的簡寫
18. complex64 複數,由兩個 32 位浮點表示(實部和虛部)
19. complex128 複數,由兩個 64 位浮點表示(實部和虛部)

Numpy 數字型別是dtype(資料型別)物件的例項,每個物件具有唯一的特徵。 這些型別可以是np.bool_np.float32等。

四、資料型別物件 (dtype)

資料型別物件描述了對應於陣列的固定記憶體塊的解釋,取決於以下方面:

  • 資料型別(整數、浮點或者 Python 物件)

  • 資料大小

  • 位元組序(小端或大端)

  • 在結構化型別的情況下,欄位的名稱,每個欄位的資料型別,和每個欄位佔用的記憶體塊部分。

  • 如果資料型別是子序列,它的形狀和資料型別。

位元組順序取決於資料型別的字首<>。 <意味著編碼是小端(最小有效位元組儲存在最小地址中)。 >意味著編碼是大端(最大有效位元組儲存在最小地址中)。

dtype可由以下語法構造:

numpy.dtype(object, align, copy)
# 引數為:
Object:被轉換為資料型別的物件。
Align:如果為true,則向欄位新增間隔,使其類似 C 的結構體。
Copy ? 生成dtype物件的新副本,如果為false,結果是內建資料型別物件的引用。

DEMO 1

# 使用陣列標量型別
import numpy as np
dt = np.dtype(np.int32)
print dt
# 輸出如下:int32

DEMO 2

#int8,int16,int32,int64 可替換為等價的字串 'i1','i2','i4',以及其他。
import numpy as np
dt = np.dtype('i4')
print dt
# 輸出如下:int32

DEMO 3

# 使用端記號
import numpy as np
dt = np.dtype('>i4')
print dt
# 輸出如下:>i4

下面的例子展示了結構化資料型別的使用。 這裡聲明瞭欄位名稱和相應的標量資料型別。

DEMO 4

# 首先建立結構化資料型別。
import numpy as np
dt = np.dtype([('age',np.int8)])
print dt
# 輸出如下:[('age', 'i1')]

DEMO 5

# 現在將其應用於 ndarray 物件
import numpy as np
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a
# 輸出如下:[(10,) (20,) (30,)]

DEMO6

# 檔名稱可用於訪問 age 列的內容
import numpy as np
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a['age']
# 輸出如下:[10 20 30]

DEMO 7

#以下示例定義名為 student 的結構化資料型別,其中包含字串欄位name,整數字段age和浮點欄位marks。 #此dtype應用於ndarray物件。
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
print student
# 輸出如下:[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')])

DEMO 8

import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print a
# 輸出如下:[('abc', 21, 50.0), ('xyz', 18, 75.0)]

每個內建型別都有一個唯一定義它的字元程式碼:

  • 'b':布林值

  • 'i':符號整數

  • 'u':無符號整數

  • 'f':浮點

  • 'c':複數浮點

  • 'm':時間間隔

  • 'M':日期時間

  • 'O':Python 物件

  • 'S', 'a':位元組串

  • 'U':Unicode

  • 'V':原始資料(void

五、Numpy的陣列屬性

1.ndarray.shape這一陣列屬性返回一個包含陣列維度的元組,它也可以用於調整陣列大小。

DEMO1

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print a.shape
# 輸出如下:(2, 3)

DEMO 2

# 這會調整陣列大小
import numpy as np
a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2)
print a
# 輸出如下:
[[1, 2]

 [3, 4]

 [5, 6]]

DEMO 3

NumPy 也提供了reshape函式來調整陣列大小。

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print b
#輸出如下:
[[1, 2]

[3, 4]

[5, 6]]

2.ndarray.ndim這一陣列屬性返回陣列的維數。

DEMO 1

# 等間隔數字的陣列
import numpy as np
a = np.arange(24) print a
# 輸出如下:[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

DEMO 2

# 一維陣列
import numpy as np
a = np.arange(24) a.ndim
# 現在調整其大小
b = a.reshape(2,4,3)
print b
# b 現在擁有三個維度
# 輸出如下:
[[[ 0, 1, 2][ 3, 4, 5]
[ 6, 7, 8][ 9, 10, 11]]
[[12, 13, 14][15, 16, 17]
[18, 19, 20][21, 22, 23]]]

3.numpy.itemsize這一陣列屬性返回陣列中每個元素的位元組單位長度。

DEMO 1​​​​​​

# 陣列的 dtype 為 int8(一個位元組)
import numpy as np
x = np.array([1,2,3,4,5], dtype = np.int8)
print x.itemsize
# 輸出如下:1

DEMO 2

# 陣列的 dtype 現在為 float32(四個位元組)
import numpy as np
x = np.array([1,2,3,4,5], dtype = np.float32)
print x.itemsize
# 輸出如下:4

4.numpy.flagsndarray物件擁有以下屬性。這個函式返回了它們的當前值。

序號 屬性及描述
1. C_CONTIGUOUS (C) 陣列位於單一的、C 風格的連續區段內
2. F_CONTIGUOUS (F) 陣列位於單一的、Fortran 風格的連續區段內
3. OWNDATA (O) 陣列的記憶體從其它物件處借用
4. WRITEABLE (W) 資料區域可寫入。 將它設定為flase會鎖定資料,使其只讀
5. ALIGNED (A) 資料和任何元素會為硬體適當對齊
6. UPDATEIFCOPY (U) 這個陣列是另一陣列的副本。當這個陣列釋放時,源陣列會由這個陣列中的元素更新

DEMO

下面的例子展示當前的標誌。

import numpy as np
x = np.array([1,2,3,4,5])
print x.flags
輸出如下:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False

六、Numpy 的陣列建立例程

新的ndarray物件可以通過任何下列陣列建立例程或使用低階ndarray建構函式構造。

1.numpy.empty它建立指定形狀和dtype的未初始化陣列。 它使用以下建構函式:

numpy.empty(shape, dtype = float, order = 'C')

構造器接受下列引數:

序號 引數及描述
1. Shape 空陣列的形狀,整數或整數元組
2. Dtype 所需的輸出陣列型別,可選
3. Order 'C'為按行的 C 風格陣列,'F'為按列的 Fortran 風格陣列

DEMO

下面的程式碼展示空陣列的例子:
import numpy as np
x = np.empty([3,2], dtype = int)
print x
輸出如下:
[[22649312 1701344351]
[1818321759 1885959276]
[16779776 156368896]]
注意:陣列元素為隨機值,因為它們未初始化。

2.numpy.zeros返回特定大小,以 0 填充的新陣列。

numpy.zeros(shape, dtype = float, order = 'C')

構造器接受下列引數:

序號 引數及描述
1. Shape 空陣列的形狀,整數或整數元組
2. Dtype 所需的輸出陣列型別,可選
3. Order 'C'為按行的 C 風格陣列,'F'為按列的 Fortran 風格陣列

DEMO1

# 含有 5 個 0 的陣列,預設型別為 float
import numpy as np
x = np.zeros(5)
print x
輸出如下:[ 0. 0. 0. 0. 0.]

DEMO 2

import numpy as np
x = np.zeros((5,), dtype = np.int)
print x
# 輸出如下:[0 0 0 0 0]

DEMO3

# 自定義型別
import numpy as np
x = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print x
輸出如下:
[[(0,0)(0,0)]
[(0,0)(0,0)]]

3.numpy.ones返回特定大小,以 1 填充的新陣列。

numpy.ones(shape, dtype = None, order = 'C')

構造器接受下列引數:

序號 引數及描述
1. Shape 空陣列的形狀,整數或整數元組
2. Dtype 所需的輸出陣列型別,可選
3. Order 'C'為按行的 C 風格陣列,'F'為按列的 Fortran 風格陣列

DEMO 1

# 含有 5 個 1 的陣列,預設型別為 float
import numpy as np
x = np.ones(5) print x
輸出如下:[ 1. 1. 1. 1. 1.]

DEMO 2​​​​​​​

import numpy as np
x = np.ones([2,2], dtype = int)
print x
輸出如下:
[[1 1]
[1 1]]