天天看點

Numpy常用操作整理

下列内容主要參考自《Python深度學習——基于Pytorch》(機械工業出版社),會随着學習加深持續更新。

import numpy as np

# 1.1 生成Numpy數組
# 1.1.1 從已有資料中建立數組
# 将清單轉換成ndarray

lst1 = [[3.14, 2.17, 4], [0, 1, 2]]
nd1 = np.array(lst1)
print(nd1)
print(type(nd1))
print(nd1.shape)  # (2,3)
print(nd1.size)  # 6

# 1.1.2 利用random子產品生成數組

# 設定浮點數種子
np.random.seed(4)

# 生成0-1的随機數
print(np.random.random(2))  # 得到的是一維數組
print(np.random.random((2, 3)))  # 得到的是2x3的數組

print(np.random.rand(2))  # 得到的是一維數組
print(np.random.rand(2, 3))  # 得到的是2x3的數組

# 生成均勻分布的随機數
print(np.random.uniform(2, 8, 2))  # 得到的是[2,8)的一維數組
print(np.random.uniform(2, 8, (3, 4)))  # 得到的是3x4的數組

# 生成标準正态分布的随機數
print(np.random.randn(3))  # 得到标準正态分布的一維數組
print(np.random.randn(3, 3))  # 得到3x3的标準正态分布的二維數組


# 随機打亂順序
lst2 = [3.14, 2.17, 4, 0, 1, 2]
x = np.array(lst2)
np.random.shuffle(x)  # 對原ndarray進行打亂,本身沒有傳回值
print(x)

# 生成随機的浮點數
print(np.random.sample())  # 随機生成一個0-1的浮點數

# 1.1.3 建立特定形狀的多元數組
a = np.array([[1, 2, 3], [4, 5, 6]])
print(np.zeros((3, 4)))  # 建立3x4的元素全為0的數組
print(np.ones((3, 4)))  # 建立3x4的元素全為1的數組
print(np.empty((3, 4)))  # 建立3x4的元素為垃圾值的數組
print(np.zeros_like(a))
print(np.ones_like(a))
print(np.empty_like(a))
print(np.eye(5))  # 5x5的對角線為1的方陣
print(np.full((3, 5), 666))  # 建立3x5的元素為666的數組
print(np.diag([1, 2, 3]))  # 三階的對角矩陣

# 1.1.4 利用arange、linspace函數生成數組
print(np.arange(10))
print(np.arange(0, 10))
print(np.arange(1, 4, 0.5))
print(np.arange(9, 0, -1))

print(np.linspace(0, 1, 10))

# 1.2 擷取元素

#  一維
nd1 = np.random.random(10)
print(nd1)
print(nd1[3])
print(nd1[3: 6])
print(nd1[1: 6: 2])
print(nd1[: : -2])

#  二維
nd2 = np.arange(25).reshape([5, 5])
print(nd2)
print(nd2[1:3, 1:3])

print(nd2[(nd2 > 3) & (nd2 < 10)])
print(nd2[[1, 2]])
print(nd2[1: 3, :])
print(nd2[:, 1: 3])

#  random.choice
a = np.arange(25)
print(np.random.choice(a, size=(3, 5)))
print(np.random.choice(a, size=(3, 5), replace=False))
print(np.random.choice(a, size=(3, 4), p=a/np.sum(a)))

# 1.3 Numpy的算術運算

# 1.3.1元素相乘
X = np.array([[1, 2], [-1, 4]])
Y = np.array([[2, 0], [3, 4]])
print(X*Y)
print(np.multiply(X, Y))

# 數組與标量相乘,或通過廣播機制和數組中的每一個元素相乘
# 一些常用的操作可以通過廣播機制實作
X = np.random.rand(2, 3)
print(X)
def relu(X):
    return np.maximum(0, X)

def softmax(X):
    return np.exp(X)/np.sum(np.exp(X))

# 1.3.2 點積運算
X1 = np.array([[1, 2, 3], [5, 6, 7]])
X2 = np.array([[1, 2], [3, 4], [5, 6]])
print(np.dot(X1, X2))

# 1.4 數組變形
# 1.4.1 更改數組形狀

# reshape:在使用時暫時改變向量的次元,不改變向量本身
arr1 = np.arange(10)
print(arr1)
temp = arr1.reshape(2, 5)
print(temp)
temp[0] = -1  # 可以看到,如果對temp做一些操作,arr中的元素也是會跟着變化的
print(arr1)  #  arr是沒有變換的

print(arr1.reshape(5, -1))  # 指定次元時可以隻指定行數或列數,其他用-1代替
print(arr1.reshape(-1, 5))

# resize: 改變向量的次元(修改了向量本身)
arr2 = np.arange(10)
print(arr2)
arr2.resize(2, 5)
print(arr2)

# T: 向量轉置
arr3 = np.arange(12).reshape(3, 4)
print(arr3)
temp = arr3.T
print(temp)
temp[0][0] = -1
print(temp)
print(arr3)  # 轉置矩陣中的值變化,原矩陣中的值也會變化

# ravel: 向量展平
arr4 = np.arange(12).reshape(2, -1)
temp1 = arr4.ravel()
temp2 = arr4.ravel('F')  # 列優先
print(temp1)
print(temp2)
temp1[0] = -1
print(arr4)

# flatten: 把矩陣轉換為向量
arr5 = np.floor(10*np.random.random((3, 4)))
print(arr5)
print(arr5.flatten())

# squeeze: 用于降維,如果某個次元隻有一項,這個次元會被去掉
arr6 = np.arange(6).reshape(3,1,2,1)
print(arr6)
print(arr6.shape)
temp = arr6.squeeze()
print(temp)
print(temp.shape)
temp[0][0] = -1
print(arr6)

# transpose: 對高維矩陣進行軸對換
arr7 = np.arange(24).reshape(2, 3, 4)
print(arr7)
print(arr7.shape)
temp = arr7.transpose(1, 2, 0)
print(temp)
print(temp.shape)

# 1.4.2 合并數組
# append & concatenate

# 對于一維數組
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.append(a, b)
print(c)

# 對于二維數組
a = np.arange(4).reshape(2, 2)
b = np.arange(4).reshape(2, 2)
c = np.append(a, b, axis=0)
print(c)
d = np.append(a, b, axis=1)
print(d)

# concatenate和append使用方法一緻,但記憶體占用更小
# 沿着哪個次元合并,恰恰不要求要拼接的兩部分在這個次元上尺度一緻,而除了這個次元之外的次元尺度必須一緻