numpy學習(2):陣列建立方式
一、前言
Numerical Python,即數值Python包,是Python進行科學計算的一個基礎包,所以是一個掌握其他Scipy庫中模組的基礎模組,一定需要先掌握該包的主要使用方式。
NumPy模組是Python的一種開源的數值計算擴充套件,是一個用python實現的科學計算包,主要包括:
- 一個具有向量算術運算和複雜廣播能力的快速且節省空間的多維陣列,稱為ndarray(N-dimensional array object)
- 用於對整組資料進行快速運算的標準數學函式:ufunc(universal function object)
- 實用的線性代數、傅立葉變換和隨機數生成函式。
- NumPy和稀疏矩陣的運算包Scipy配合使用更加方便。
其中,numpy有一個核心的資料結構,叫做ndarray
。
下面再瞭解一下ndarray
的基本特徵。
- NumPy的陣列類被稱作ndarray。通常被稱作陣列。注意numpy.array和標準Python庫類array.array並不相同,後者只處理一維陣列和提供少量功能。
- 一種由相同型別的元素組成的多維陣列,元素數量是實現給定好的 元素的資料型別由dtype(data-type)物件來指定,每個ndarray只有一種dtype型別
- ndarray的大小固定,建立好陣列後陣列大小是不會再發生改變的
二、ndarray物件建立
可以通過numpy模組中的常用的幾個函式進行建立ndarray多維陣列物件,主要函式如下:
- array函式:接收一個普通的python序列,並將其轉換為ndarray
- zeros函式:建立指定長度或者形狀的全零陣列。
- ones函式:建立指定長度或者形狀的全1陣列。
- empty函式:建立一個沒有任何具體值的陣列(準備地說是建立一些未初始化的ndarray多維陣列)
2.1、array函式
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 | 指定返回陣列的最小維數。 |
看了這麼多定義,下面看看具體的例項吧。
- 例項1
import numpy as np
#例子01
a = np.array([1,2,3,4,5])
print(a)
print(type(a))
輸出:[1 2 3] <class ‘numpy.ndarray’>
- 建立多個維度
a2 = np.array([[1,2],[3,4]])
print(a2)
輸出: [[1 2] [3 4]]
- 通過ndmin控制最小維度
#最小維度
a3 = np.array([1,2,3,4,5],ndmin = 3)
print(a3)
輸出 [[[1 2 3 4 5]]]
ndmin這個引數的意思是,不管你給的資料的維度是多少,我總是會建立給出的最小的維度,比如這裡ndmin=3,雖然給出的資料是一位的,但是也會建立一個三維的處理。
2.2、empty函式
- numpy.empty 建立指定形狀和dtype的未初始化陣列
- numpy.empty(shape, dtype = float, order = ‘C’)
構造器接受下列引數:
序號 | 引數及描述 |
---|---|
1. Shape | 空陣列的形狀,整數或整數元組 |
2. Dtype | 所需的輸出陣列型別,可選 |
3. Order | 'C’為按行的 C 風格陣列,'F’為按列的 Fortran 風格陣列 |
舉例:
#陣列元素為隨機值:建立一個4*4的的矩陣,資料為隨機
arr = np.empty((4,4),dtype = 'i1')
print(arr)
輸出: [[ 1 0 0 0] [ 0 0 0 0] [ 48 6 50 38] [ -7 127 0 0]]
- numpy.zeros 返回特定大小,以0填充
#例
arr = np.zeros((3,3))
print(arr)
# 自定義型別
arr = np.zeros((3,3), dtype = [('x', 'i2'), ('y', 'i2')])
print(arr)
- numpy.ones 返回特定大小,以1填充
arr = np.ones((2,3,4))
print(arr)
arr = np.ones((3,3), dtype = [('x', 'i4'), ('y', 'i4')])
print(arr)
輸出:
[[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
[[(1, 1) (1, 1) (1, 1)]
[(1, 1) (1, 1) (1, 1)]
[(1, 1) (1, 1) (1, 1)]]
2.3、通過列表,元祖,元祖列表建立方式
這些主要是通過列表,元祖,元祖列表來建立的方式。
- numpy.asarray 類似 numpy.array 可以將Python序列轉換為ndarray
#來自列表
arr = [1,2,3,4]
arr2 = np.asarray(arr)
print(arr2)
print(type(arr))
print(type(arr2))
輸出: [1 2 3 4] <class ‘list’> <class ‘numpy.ndarray’>
#來自元組
arr = (1,2,3,4)
arr2 = np.asarray(arr)
print(arr2)
print(type(arr))
print(type(arr2))
#來自元組列表
arr = [(1,2,3,4),(5,6,7,8)]
arr2 = np.asarray(arr)
print(arr2)
print(type(arr))
print(type(arr2))
2.4、通過Numpy 來自數值範圍的陣列(arange、linespace、logspace)
-
arange函式: 類似python的range函式,通過指定開始值、終值和步長來建立一個一維陣列,注意:最終建立的陣列不包含終值
-
linspace函式:通過指定開始值、終值和元素個數來建立一個一維陣列,陣列的資料元素符合等差數列,可以通過endpoint關鍵字指定是否包含終值,預設包含終值
-
logspace函式:和linspace函式類似,不過建立的是等比數列陣列 使用隨機數填充陣列,即使用numpy.random中的random()函式來建立0-1之間的隨機元素,陣列包含的元素數量由引數決定
-
numpy.arange 這個函式返回ndarray物件,包含給定範圍內的等間隔值 numpy.arange(start,stop,step,dtype)
arr = np.arange(1,20,5,dtype = float)
print(arr)
輸出: [ 1. 6. 11. 16.]
- numpy.linspace 與arange函式類似 等差數列 numpy.linspace(start,stop,num,endpoint,retstep,dtype)
start | 起始值 |
---|---|
stop | 結束值 |
num | 生成等間隔樣例的數量,預設為50 |
endpoint | 序列中是否包含stop 值 預設為 True |
arr = np.linspace(10,20,9)
print(arr)
arr = np.linspace(10,20,5,endpoint=False)
print(arr)
arr = np.linspace(10,20,5,retstep=True)
print(arr) #返回步長
輸出: [10. 11.25 12.5 13.75 15. 16.25 17.5 18.75 20. ] [10. 12. 14. 16. 18.] (array([10. , 12.5, 15. , 17.5, 20. ]), 2.5)
- numpy.logspace 等比數列 numpy.logscale(start, stop, num, endpoint, base, dtype)
1. start | 起始值是base ** start |
---|---|
2. stop | 終止值是base ** stop |
3. num | 範圍內的數值數量,預設為50 |
4. endpoint | 如果為true,終止值包含在輸出陣列當中 |
5. base | 對數空間的底數,預設為10 |
6. dtype | 輸出陣列的資料型別,如果沒有提供,則取決於其它引數 |
arr = np.logspace(1,10,10,base = 2)
print(arr)
輸出: [ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]
2.5、random建立方式
- rand 返回 0 - 1 隨機值
- randn 返回一個樣本具有標準正態分佈
- randint 返回隨機的整數,位於半開區間[low,hight)size = 10 (3,3)
- random_integers(low[, high, size]) 返回隨機的整數,位於閉區間
- random 返回隨機浮點數
arr = np.random.rand(9).reshape(3,3)
print(arr)
arr = np.random.rand(3,2,3)
print(arr)
arr = np.random.randn(9).reshape(3,3)
print(arr)
arr = np.random.randn(3,2,3)
print(arr)
arr = np.random.randint(1,9,size = (2,4))
print(arr)
arr = np.random.random_integers(1,9,size =(2,4))
print(arr)
arr = np.random.random((3,2,3))
print(arr)
arr = np.random.randn(3,2,3)
print(arr)