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
是使用 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 ,通常為int32 或int64 |
3. | intc 相當於 C 的int ,通常為int32 或int64 |
4. | intp 用於索引的整數,相當於 C 的size_t ,通常為int32 或int64 |
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]]