Ndarray對象
NumPy 最重要的一個特點是其 N 維數(shù)組對象 ndarray
ndarray 對象是用于存放同類型元素的多維數(shù)組
ndarray 內(nèi)部由以下內(nèi)容組成:
- 一個指向數(shù)據(jù)(內(nèi)存或內(nèi)存映射文件中的一塊數(shù)據(jù))的指針封恰。
- 數(shù)據(jù)類型或 dtype螺句,描述在數(shù)組中的固定大小值的格子娶桦。
- 一個表示數(shù)組形狀(shape)的元組,表示各維度大小的元組糕档。
- 一個跨度元組(stride),其中的整數(shù)指的是為了前進(jìn)到當(dāng)前維度下一個元素需要"跨過"的字節(jié)數(shù)愧杯。
創(chuàng)建一個 ndarray 只需調(diào)用 NumPy 的 array 函數(shù)即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
插:
numpy array 類的reshape的用法
eg:
x = np.zeros((2,3,4))
x 是一個三維的零向量
x.reshape(2,3,2,2)
x 變成四維
x.reshape(-1)
返回x直接展開為1維的數(shù)組瑞侮,但是x不變。和x.reshape(1,-1)等價
x 的總元素個數(shù): 2*3*4 = 24個
那么x.reshape(n,-1) 返回x展開成(n, 24/n)的數(shù)組
同理:x.reshape(-1, n)返回x展開成(24/n, n)的數(shù)組
x.reshape(n1,n2,-1) 返回x展開成 (n1, n2, 24/(n1*n2))的數(shù)組
ndarray的一些常見屬性:
ndarray.ndim:
秩溪食,即軸的數(shù)量或維度的數(shù)量-
ndarray.shape:
數(shù)組的維度囊卜,對于矩陣,n 行 m 列
返回值是一個元組
如:a = np.array([[1,2,3],[4,5,6]])
a.shape -> (2,3)
通過給shape賦值還可以改變ndarray的結(jié)構(gòu):
image.png ndarray.size:
數(shù)組元素的總個數(shù)错沃,相當(dāng)于 .shape 中 n*m 的值
Numpy創(chuàng)建數(shù)組
-
numpy.empty
numpy.empty 方法用來創(chuàng)建一個指定形狀(shape)栅组、數(shù)據(jù)類型(dtype)且未初始化的數(shù)組:
numpy.empty(shape, dtype = float, order = 'C')
image.png
注意 : 數(shù)組元素為隨機(jī)值,因為它們未初始化枢析。
- numpy.zeros
創(chuàng)建指定大小的數(shù)組玉掸,數(shù)組元素以 0 來填充:
numpy.zeros(shape, dtype = float, order = 'C')
注: 默認(rèn)為浮點數(shù),可以自己設(shè)置數(shù)字類型醒叁,eg:
y = np.zeros((5,), dtype = np.int) - numpy.ones
用 1 來填充數(shù)組
Numpy從已有的數(shù)組創(chuàng)建數(shù)組:
-
numpy.asarray
numpy.asarray(a, dtype = None, order = None)
image.png
可以把列表司浪,元組等作為參數(shù)a傳入asarray中轉(zhuǎn)化為ndarray
- numpy.frombuffer
numpy.frombuffer 用于實現(xiàn)動態(tài)數(shù)組。
numpy.frombuffer 接受 buffer 輸入?yún)?shù)把沼,以流的形式讀入轉(zhuǎn)化成 ndarray 對象啊易。 - numpy.fromiter
numpy.fromiter 方法從可迭代對象中建立 ndarray 對象,返回一維數(shù)組饮睬。
NumPy 從數(shù)值范圍創(chuàng)建數(shù)組
- numpy.arange
numpy.arange(start, stop, step, dtype)
start : 起始值租谈,默認(rèn)為0
stop : 終止值(不包含)
step: 步長,默認(rèn)為1
dtype:返回ndarray的數(shù)據(jù)類型捆愁,如果沒有提供割去,則會使用輸入數(shù)據(jù)的類型。
x = np.arange(5)
x -> [0 1 2 3 4]
- numpy.linspace
numpy.linspace 函數(shù)用于創(chuàng)建一個一維數(shù)組昼丑,數(shù)組是一個等差數(shù)列構(gòu)成的呻逆,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start : 序列的起始值
stop:序列的終止值,如果endpoint為true菩帝,該值包含于數(shù)列中
num : 要生成的等步長的樣本數(shù)量页慷,默認(rèn)為50
endpoint : 該值為 true 時,數(shù)列中包含stop值胁附,反之不包含酒繁,默認(rèn)是True。
retstep : 如果為 True 時控妻,生成的數(shù)組中會顯示間距州袒,反之不顯示。
dtype: ndarray 的數(shù)據(jù)類型
擴(kuò)展:
b =np.linspace(1,10,10).reshape([10,1])
b ->
[[ 1.]
[ 2.]
[ 3.]
[ 4.]
[ 5.]
[ 6.]
[ 7.]
[ 8.]
[ 9.]
[10.]]
- numpy.logspace
numpy.logspace 函數(shù)用于創(chuàng)建一個于等比數(shù)列弓候。格式如下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
注:
start : 起始值為 base ^ start eg:base = 10 start = 1郎哭,起始值為10他匪,start = 2 ,起始值為100
stop:同理
剩余同理
NumPy 切片和索引
切片
- slice 定義切片:
a = np.arange(10)
s = slice(2,7,2) # 從索引2開始切夸研,到索引7截至邦蜜,步長為2
print(a[s]) -> [2,4,6]
- 冒號切片:
和python 的list切片一致 - 帶有省略號的切片:
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
a[...,1] # 第二列元素 -> [2 4 5]
a[1,...] # 第二行元素 -> [3,4,5]
a[...,1:] # 第二列及剩下的所有元素:
[[2 3]
[4 5]
[5 6]]
Numpy 廣播:
例子:
設(shè)有兩個數(shù)組 a 和 b,如果兩個數(shù)組的形狀相同亥至,a.shape == b.shape , 那么
a*b 的結(jié)果就是a與b數(shù)組對應(yīng)為相乘悼沈。這要求a和b維度相同而且各維度的長度相同。
當(dāng)運算中的兩個數(shù)組形狀不相同時姐扮,numpy自動觸發(fā)廣播機(jī)制絮供。
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
->
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
由此可見,numpy自動把 b 變化成了 [[1,2,3],[1,2,3],[1,2,3],[1,2,3]],以便和a做相加
- np.tile(a,(m,n))
就是將矩陣 a 橫向復(fù)制為原來的m倍茶敏,縱向賦值為原來的n倍
數(shù)組修改操作
待續(xù)