1. 程式人生 > 其它 >Numpy建立陣列--Numpy(二)

Numpy建立陣列--Numpy(二)

Numpy建立陣列


引入:

上次我們瞭解了Numpy操作的物件是Ndarray陣列,並學習了一些Numpy陣列的基本屬性。實際上,Numpy的基本思想就是面向陣列程式設計,在資料處理中,我們往往需要對某一行或列進行處理,這時就需要用Numpy提取為Ndarray物件進行處理。現在讓我們真正開始Numpy的學習,就像我們學習大多數語言那樣,我們該如何創建出一個物件?這就是本節的重點,Numpy建立陣列。


numpy.empty

numpy.empty 方法用來建立一個指定形狀(shape)、資料型別(dtype)且未初始化的陣列,我們有如下三個引數可供選擇:

引數 描述
shape 陣列形狀
dtype 資料型別,可選
order 有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機記憶體中的儲存元素的順序。

現在讓我們建立一個數組!

import numpy as np 
x = np.empty([3,2], dtype = int) 
print (x)

得到:

[[         0 1072693248]
 [         0 1073741824]
 [         0 1074266112]]

numpy.zeros

numpy.zeros用來建立指定大小的陣列,陣列元素以 0 來填充。

我們來看以下三個例子,這三個例子更加有助於我們瞭解方法的引數列表.

# 預設為浮點數
x = np.zeros(5) 
print(x)
 
# 設定型別為整數
y = np.zeros((5,), dtype = np.int) 
print(y)
 
# 自定義型別
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print(z)

這三個結果分別是:

[0. 0. 0. 0. 0.]
[0 0 0 0 0]
[[(0, 0) (0, 0)]
 [(0, 0) (0, 0)]]

另一個簡潔的例子:

z = np.zeros((2,2))  
print(z)

得到:

[[0. 0.]
 [0. 0.]]

numpy.ones

numpy.ones同上述方法,它返回的均是1.

# 預設為浮點數
x = np.ones(5) 
print(x)
 
# 自定義型別
x = np.ones([2,2], dtype = int)
print(x)

返回:

[1. 1. 1. 1. 1.]
[[1 1]
 [1 1]]

Numpy 建立標準正態分佈陣列

在機器學習中,我們經常需要資料保持標準正態分佈,Nmupy給我們提供了一個可以建立符合正態分佈標準的陣列。

from numpy import *

a=random.randint(100,200,(3,3))
print(a)

這個陣列為:

[[122 108 183]
 [151 101 108]
 [145 102 133]]

總結:

通過上述幾個方法,你現在一定已經學會了最基本建立陣列的方法,接下來我們將學習如何從已有的陣列建立新的陣列。

NumPy 從已有的陣列建立陣列

numpy.asarray

numpy中的asarray方法可以將Python中的各種原始型別轉換為numpy中的ndarray陣列型別。

引數列表如下:

numpy.asarray(a, dtype = None, order = None)

引數 描述
a 任意形式的輸入引數,可以是,列表, 列表的元組, 元組, 元組的元組, 元組的列表,多維陣列
dtype 資料型別,可選
order 可選,有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機記憶體中的儲存元素的順序。

讓我們舉一個最簡單的例子:

import numpy as np 
 
x =  [1,2,3] 
a = np.asarray(x)  
print (a)

得到新的ndarray陣列:

[1 2 3]

numpy.frombuffer

numpy.frombuffer 用於實現動態陣列。

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

注意:buffer 是字串的時候,Python3 預設 str 是 Unicode 型別,所以要轉成 bytestring 在原 str 前加上 b。

引數 描述
buffer 可以是任意物件,會以流的形式讀入。
dtype 返回陣列的資料型別,可選
count 讀取的資料數量,預設為-1,讀取所有資料。
offset 讀取的起始位置,預設為0。

可以用來讀入字串並將其轉換為ndarray陣列型別:

import numpy as np 
 
s =  b'Hello World' 
a = np.frombuffer(s, dtype =  'S1')  
print (a)
[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']

numpy.fromiter

numpy.fromiter 方法從可迭代物件中建立 ndarray 物件,返回一維陣列。

# 使用 range 函式建立列表物件  
list=range(5)
it=iter(list)
 
# 使用迭代器建立 ndarray 
x=np.fromiter(it, dtype=float)
print(x)

返回結果:

[0. 1. 2. 3. 4.]

上述例子實際上是先構造一個迴圈到4為止的陣列,迭代器就是 相當於i++的功能,隨著i的不斷迴圈,i不斷自增。然後將這個陣列轉換為Ndarray物件。

NumPy 從數值範圍建立陣列

接下來的三個方法將是我們在資料處理中最常使用的三種方法。

numpy.arange

根據 start 與 stop 指定的範圍以及 step 設定的步長,生成一個 ndarray。

引數 描述
start 起始值,預設為0
stop 終止值(不包含)
step 步長,預設為1
dtype 返回ndarray的資料型別,如果沒有提供,則會使用輸入資料的型別。

基本例子:

x = np.arange(5)  
print (x)

得到結果:

[0 1 2 3 4]

設定了dtype:

x = np.arange(5, dtype =  float)  
print (x)

結果為浮點數:

[0. 1. 2. 3. 4.]

設定了起始值、終止值及步長:

x = np.arange(10,20,2)  
print (x)

結果為從10開始,到20結束(不包括20),間隔為2的ndarray型別陣列:

[10 12 14 16 18]

numpy.linspace

numpy.linspace 函式用於建立一個一維陣列,陣列是一個等差數列構成的,格式如下:

a = np.linspace(1,10,10)

設定元素全部是1的等差數列:

a = np.linspace(1,1,10)

將 endpoint 設為 false,不包含終止值:

a = np.linspace(10, 20,  5, endpoint =  False)  

如果將 endpoint 設為 true,則會包含 20。

以下例項設定間距。

a =np.linspace(1,10,10,retstep= True)
print(a)
# 拓展例子
b =np.linspace(1,10,10).reshape([10,1])
print(b)
(array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]), 1.0)
[[ 1.]
 [ 2.]
 [ 3.]
 [ 4.]
 [ 5.]
 [ 6.]
 [ 7.]
 [ 8.]
 [ 9.]
 [10.]]

numpy.logspace

numpy.logspace 函式用於建立一個於等比數列。格式如下:

# 預設底數是 10
a = np.logspace(1.0,  2.0, num =  10)  

設定底數為2

a = np.logspace(0,9,10,base=2)