如何改變數組的形狀?
前面說過,數組的
shape
屬性返回一個元組,能夠反映數組的形狀,包括維度以及每個軸的元素數量。
那麼如果給定一個數組,怎麼改變其形狀呢?
常用的方式有兩種:
reshape方法,它返回一個新的數組,而不能改變原始數組。resize方法,無返回值,它更改了原始數組。比如說我要將一個二維數組轉換為三維數組。
import numpy as np
# 創建二維數組
x2 = np.array([[1,2,3],[4,5,6]])
# 將x2轉換為三維數組,並且自定義每個軸的元素數量
x2.reshape(1,2,3)
'''
輸出:
array([[[1, 2, 3],
[4, 5, 6]]])
'''
reshape
方法可以傳入整數或者元組形式的參數。傳入的參數和shape屬性返回的元組的含義是一樣的。例如,x2.reshape(1,2,3)是將二維數組轉換成三維數組,參數個數代表要轉換的維度,參數數字從左到右分別表示0軸、1軸、2軸的元素數量。resize方法和reshape方法使用形式一樣,區別是resize方法改變了原始數組形狀。import numpy as np# 創建二維數組x2 = np.array([[1,2,3],[4,5,6]])# 將x2轉換為三維數組,並且自定義每個軸的元素數量x2.resize((1,2,3))x2'''輸出:array([[[1, 2, 3],[4, 5, 6]]])'''如何對數組進行索引和切片操作?numpy一維數組的索引和切片操作類似python列表,這裡不多講。比如說取一維數組前三個元素。import numpy as np# 創建一維數組x1 = np.array([1,2,3,4])# 切片,取前三個元素x1[:3]'''輸出:array([1, 2, 3])'''重點是對多維數組的索引和切片。多維數組有多個軸,那麼就需要對每個軸進行索引。例如,三維數組形狀為(x,y,z),分別代表:0軸有x個元素、1軸有y個元素,2軸有z個元素。對0、1、2軸進行索引,如果取o軸第2個元素、1軸第0個元素、2軸第3個元素,那麼索引形式就為[2,0,3]。import numpy as np# 創建三維數組x3 = np.arange(24).reshape(3,2,4)# 對該三維數組進行索引x3[2,0,3]'''輸出:19三維數組形式:array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]], [[16, 17, 18, 19], [20, 21, 22, 23]]])'''切片也是同樣道理。如果取o軸前2個元素、1軸前1個元素、2軸後2個元素,那麼切片形式就為[:2,:1,-2:]。import numpy as np# 創建三維數組x3 = np.arange(24).reshape(3,2,4)# 對該三維數組進行切片x3[:2,:1,-2:]'''輸出:array([[[ 2, 3]], [[10, 11]]])三維數組形式:array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]], [[16, 17, 18, 19], [20, 21, 22, 23]]])'''如何對數組裡每個元素進行迭代?說到迭代,大家很容易想到直接對數組直接使用for循環操作,對於一維數組來說,當然是可以的。import numpy as np# 創建一維數組x1 = np.array([1,2,3,4])# 迭代for i in x1: print(i)'''輸出:1234'''但對於多維數組,迭代是相對於0軸完成的,就是多維數組最外層的那一維。你沒有辦法直接遍歷數組裡每一個元素,嵌套循環又太低效。這個時候就需要用到flat方法,它可以將多維數組平鋪為一維的迭代器。import numpy as np# 創建二維數組x2 = np.array([[1,2,3],[4,5,6]])# 先平鋪,再迭代for i in x2.flat: print(i)'''輸出:123456'''如何將多維數組展開為一維數組?數組(ndarray)對象提供了ravel方法,用來將多維數組展開為一維數組。import numpy as np# 創建er維數組x3 = np.arange(12).reshape(3,4)# 對該三維數組進行索引x3.ravel()'''輸出:array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])'''什麼廣播機制?廣播(Broadcast)是 numpy 對不同形狀(shape)的數組進行數值計算的方式, 對多個數組的算術運算通常在相應的元素上進行。較小的數組在較大的數組上「廣播」,以便它們具有兼容的形狀。比如說一個一維數組乘以一個數字,相當於一維數組裡每個元素都乘以這個數。
import numpy as np# 創建一維數組x1 = np.array([1,2,3])# 廣播x1 * 2'''輸出:array([2, 4, 6])'''如果相同維度的數組進行運算,其shape相同,那麼廣播就是兩個數組相同位數的元素進行運算。
import numpy as np# 創建一維數組x1 = np.array([1,2,3])x2 = np.array([4,5,6])# 廣播x1 + x2'''輸出:array([5, 7, 9])'''如果兩個數組維度不同,進行運算,這裡就觸發了廣播的兩個規則。讓所有輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都通過在前面加 1 補齊;當輸入數組的某個維度的長度為 1 時,沿著此維度運算時都用此維度上的第一組值。這兩個規則保證了不同維度數組進行運算時,其維度自動調整成一致。
import numpy as np# 創建一維數組x1 = np.array([[1,2,3],[4,5,6]])x2 = np.array([2,3,4])# 廣播x1 - x2'''輸出:array([[-1, -1, -1],[ 2, 2, 2]])'''16、numpy中如何進行數值捨入操作?around函數,用於四捨五入,返回一個新數組import numpy as np# 創建一維數組x1 = np.array([1.45,2.78,3.12])# 四捨五入,到小數點後1位np.around(x1,1)'''輸出:array([1.4, 2.8, 3.1])'''floor函數,用於向下取整,返回一個新數組import numpy as np# 創建一維數組x1 = np.array([1.45,2.78,3.12])# 向下取整np.floor(x1)'''輸出:array([1., 2., 3.])'''ceil函數,用於向上取整,返回一個新數組import numpy as np# 創建一維數組x1 = np.array([1.45,2.78,3.12])# 向下取整np.ceil(x1)'''輸出:array([2., 3., 4.])'''17、如何對數組進行轉置操作?numpy提供了transpose函數用以對數組進行維度的調換,也就是轉置操作。轉置後返回一個新數組。import numpy as np# 創建二維數組x1 = np.arange(12).reshape(3,4)# 轉置np.transpose(x1)'''輸出:array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])原數組:array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])'''當然,可以用更簡單的方法。數組對象提供了T方法,用於轉置,同樣會返回一個新數組。import numpy as np# 創建二維數組x1 = np.arange(12).reshape(3,4)# 轉置x1.T'''輸出:array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])原數組:array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])'''18、如何連接兩個相同維度的數組?numpy的concatenate函數用於沿指定軸連接相同形狀的兩個或多個數組。import numpy as np# 創建兩個二維數組x1 = np.array([[1,2,3],[4,5,6]])x2 = np.array([[7,8,9],[10,11,12]])# 連接,默認沿0軸連接np.concatenate((x1,x2))'''輸出:array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])'''# 指定沿1軸連接np.concatenate((x1,x2),axis=1)'''輸出:array([[ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12]])'''19、如何向數組添加值?numpy的append函數向數組末尾追加值,可以指定不同的軸。import numpy as np# 創建一個二維數組x1 = np.array([[1,2,3],[4,5,6]])# 直接向數組末尾添加元素,返回平鋪的一維數組np.append(x1,[7,8,9])'''輸出:array([1, 2, 3, 4, 5, 6, 7, 8, 9])'''# 沿軸 0 添加元素np.append(x1, [[7,8,9]],axis = 0)'''輸出:array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])'''# 沿軸 1 添加元素np.append(x1, [[5,5,5],[7,8,9]],axis = 1)'''輸出:array([[1, 2, 3, 5, 5, 5], [4, 5, 6, 7, 8, 9]])'''numpy的insert函數可以沿給定軸,在數組中任意位置插入數據。import numpy as np# 創建一個二維數組x1 = np.array([[1,2,3],[4,5,6],[7,8,9]])# 直接在指定位置插入元素,返回平鋪的一維數組np.insert(x1,2,[0,0,0])'''輸出:array([1, 2, 0, 0, 0, 3, 4, 5, 6, 7, 8, 9])原數組:array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])'''# 指定位置,沿軸 0 插入元素np.insert(x1,1,[0,0,0],axis=0)'''輸出:array([[1, 2, 3], [0, 0, 0], [4, 5, 6], [7, 8, 9]])'''# 指定位置,沿軸 1插入元素np.insert(x1,2,[0,0,0],axis=1)'''輸出:array([[1, 2, 0, 3], [4, 5, 0, 6], [7, 8, 0, 9]])'''20、如何對數組進行去重操作?numpy的unique函數用於去除數組中的重複元素,返回一個新數組。import numpy as np# 創建一個一維數組x1 = np.array([2,3,5,1,3,8,1,0])np.unique(x1)'''輸出:array([0, 1, 2, 3, 5, 8])'''unique函數還能返回重複元素的索引、計數等信息,可去查文檔自定義參數。未完待續!
轉發關注+私信「學習即可領取Python教程」