《原神攻略》1.5版0命鍾離隊伍配置參考
阿新 • • 發佈:2021-05-12
目錄
- 1.1 認識NumPy陣列物件
- 1.2 建立NumPy陣列
- 1.3 ndarry物件的資料型別
- 1.4 陣列運算
- 1.5 ndarray的索引和切片
- 1.6 陣列的轉置和軸對稱
- 1.7 NumPy通用函式
- 1.8 利用NumPy陣列進行資料處理
- 1.8.2 陣列統計運算
- 1.9 線性代數模組
- 1.10隨機數模組
1.1 認識NumPy陣列物件
import numpy as np #匯入numpy包
data=np.arrange(12).reshape(3,4) # 建立一個3行4列的陣列
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-2-3f54680f24d6> in <module> ----> 1 data=np.arrange(12).reshape(3,4) # 建立一個3行4列的陣列 D:\Anacanda\lib\site-packages\numpy\__init__.py in __getattr__(attr) 212 return Tester 213 else: --> 214 raise AttributeError("module {!r} has no attribute " 215 "{!r}".format(__name__, attr)) 216 AttributeError: module 'numpy' has no attribute 'arrange'
data=np.arange(12).reshape(3,4) # 建立一個3行4列的陣列
data
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
type(data)
numpy.ndarray
data.npim
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-6-80cde699d9bc> in <module> ----> 1 data.npim AttributeError: 'numpy.ndarray' object has no attribute 'npim'
data.ndim #檢視陣列的維度,2表示時二維陣列
2
data.shape # 陣列的維度,輸出結果(3,4),表示3行4列
(3, 4)
data.size # 陣列的元素個數
12
data.dtype # 陣列元素的型別,輸出結果dtype('int32'),表示元素型別都是int32
dtype('int32')
1.2 建立NumPy陣列
import numpy as np
data1 = np.array([1,2,3]) # 建立一個一維陣列
data1
array([1, 2, 3])
data2 = np.array([[1,2,3],[4,5,6]]) # 建立一個二維陣列
data2
array([[1, 2, 3],
[4, 5, 6]])
data3 = np.zeros((3,4)) #建立一個3行4列的全零陣列
data3
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
data4 = np.ones((3,4)) #建立一個3行4列的全1陣列
data4
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
data5 = np.empty((5,2)) # 建立全空陣列,其實每個值都是接近於零的數
data5
array([[1.10993472e-311, 1.82804289e-322],
[0.00000000e+000, 0.00000000e+000],
[6.79038653e-313, 1.16095484e-028],
[4.26231948e-096, 9.78750380e+199],
[6.97843734e+252, 1.47917289e-071]])
data6 = np.arange(1,20,2) #建立陣列從 1--19,不包括20,步長為2.
data6
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
data7 = np.array([1,2,3],float) #建立浮點型陣列
data7
array([1., 2., 3.])
data8 = np.array([1,2,3],dtype = 'int32') #建立一個元素型別為 int32 的陣列
data8
array([1, 2, 3])
1.3 ndarry物件的資料型別
1.3.1 檢視資料型別
data9 = np.array([[1,2,3],[4,5,6]])
data9
array([[1, 2, 3],
[4, 5, 6]])
data9.dtype #檢視資料型別
dtype('int32')
data9.dtype.name #檢視資料型別
'int32'
1.3.2 轉換資料型別
data9
array([[1, 2, 3],
[4, 5, 6]])
int_data9 = data9.astype(np.int32) #將陣列 data9 轉換為 int32 型別
int_data9
array([[1, 2, 3],
[4, 5, 6]])
float_data9 = int_data9.astype(np.float64) #將陣列 int_data9 轉換為 float64 型別
float_data9
array([[1., 2., 3.],
[4., 5., 6.]])
str_data9 = float_data9.astype(np.str) #將陣列 float_data9 轉換為 str 型別
str_data9
array([['1.0', '2.0', '3.0'],
['4.0', '5.0', '6.0']], dtype='<U32')
1.4 陣列運算
1.4.1向量化運算
data10 = np.array([[1,2,3],[4,5,6]])
data10
array([[1, 2, 3],
[4, 5, 6]])
data11 = np.array([[4,5,6],[1,2,3]])
data11
array([[4, 5, 6],
[1, 2, 3]])
data10 + data11 # 陣列相加 相同位置元素相加
array([[5, 7, 9],
[5, 7, 9]])
data10 * data11 #陣列相乘 相同位置元素相乘
array([[ 4, 10, 18],
[ 4, 10, 18]])
data10 - data11 # 陣列相減 相同位置元素相減
array([[-3, -3, -3],
[ 3, 3, 3]])
data10 / data11 # 陣列相除 相同位置元素相除
array([[0.25, 0.4 , 0.5 ],
[4. , 2.5 , 2. ]])
1.4.2 陣列廣播
當兩個陣列的(行數,列數)不一樣的時候,就會自動觸發廣播機制。
data12 = np.array([[0],[1],[2]])
data12 #3行1列
array([[0],
[1],
[2]])
data13 = np.array([0,1,2])
data13 #1行3列
array([0, 1, 2])
data12 + data13
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
原理如下圖所示:
1.4.3 陣列與標量間的運算
data9
array([[1, 2, 3],
[4, 5, 6]])
num = 10
陣列與標量間的運算,標量會與陣列的每一個元素,進行運算。
data9 + num
array([[11, 12, 13],
[14, 15, 16]])
data9 * num
array([[10, 20, 30],
[40, 50, 60]])
data9 - num
array([[-9, -8, -7],
[-6, -5, -4]])
data9 / num
array([[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6]])
1.5 ndarray的索引和切片
1.5.1 整數索引和切片的基本使用
data14 = np.arange(8)
data14
array([0, 1, 2, 3, 4, 5, 6, 7])
data14[5] # 獲取索引為5的元素
5
data14[3:5] # 獲取索引為3~5的元素,但不包括5
array([3, 4])
data14[1:6:2] # 獲取索引為1~6的元素,步長為2
array([1, 3, 5])
data15 = np.array([[1,2,3],[4,5,6],[7,8,9]])
data15
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
data15[1] # 獲取索引為1的元素
array([4, 5, 6])
data15[0][1] # 獲取位於第0行第1列的元素
2
data15[:2] #獲取0,1兩行的元素
array([[1, 2, 3],
[4, 5, 6]])
data15[:2,:2] #獲取行號為0,1;列號為0,1的元素
array([[1, 2],
[4, 5]])
data15[1,:2] #獲取行號為1;列號為0,1的元素
array([4, 5])
1.5.2 花式(陣列)索引的基本使用
data16 = np.empty((4, 4)) # 建立一個空陣列
for i in range(4):
data16[i] = np.arange(i, i + 4) # 動態地為陣列新增元素
data16
array([[0., 1., 2., 3.],
[1., 2., 3., 4.],
[2., 3., 4., 5.],
[3., 4., 5., 6.]])
data16[[0,2]] # 獲取 第零行、第兩行 的元素
array([[0., 1., 2., 3.],
[2., 3., 4., 5.]])
data16[[1,3],[1,2]] # 獲取索引為(1,1)和(3,2)的元素
array([2., 5.])
1.5.3 布林型
student_name = np.array(['Tom', 'Lily', 'Jack', 'Rose']) # 儲存學生姓名的陣列
student_name
array(['Tom', 'Lily', 'Jack', 'Rose'], dtype='<U4')
student_score = np.array([[79, 88, 80], [89, 90, 92], [83, 78, 85], [78, 76, 80]]) # 儲存學生成績的陣列
student_score
array([[79, 88, 80],
[89, 90, 92],
[83, 78, 85],
[78, 76, 80]])
student_name == 'Jack' # 對student_name和字串“Jack”通過 == 運算子產生一個布林型陣列
array([False, False, True, False])
# 將布林陣列作為索引應用於儲存成績的陣列student_score,
# 返回的資料是True值對應的行
student_score[student_name=='Jack']
array([[83, 78, 85]])
student_score[student_name=='Jack',:1] #獲取Jack的第一門課程成績。
array([[83]])
1.6 陣列的轉置和軸對稱
transpose和swapaxes的用法,詳見:該部落格
data17 = np.arange(12).reshape(3,4)
data17
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
data17.T # 使用T屬性對陣列進行轉置
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
arr = np.arange(16).reshape((2, 2, 4)) #建立一個2*2*4的三維陣列。
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.T #此時T已經失效
array([[[ 0, 8],
[ 4, 12]],
[[ 1, 9],
[ 5, 13]],
[[ 2, 10],
[ 6, 14]],
[[ 3, 11],
[ 7, 15]]])
arr.transpose(1,2,0)
array([[[ 0, 8],
[ 1, 9],
[ 2, 10],
[ 3, 11]],
[[ 4, 12],
[ 5, 13],
[ 6, 14],
[ 7, 15]]])
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.swapaxes(1, 0)
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
arr.transpose(1,0,2)
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
1.7 NumPy通用函式
data18 = np.array([1,4,9,16])
data18
array([ 1, 4, 9, 16])
np.sqrt(data18) #開方
array([1., 2., 3., 4.])
np.abs(data18) #取絕對值
array([ 1, 4, 9, 16])
np.square(arr) #求平方
array([[[ 0, 1, 4, 9],
[ 16, 25, 36, 49]],
[[ 64, 81, 100, 121],
[144, 169, 196, 225]]], dtype=int32)
x = np.array([12, 9, 13, 15])
y = np.array([11, 10, 4, 8])
np.add(x,y) # 相當於 x + y
array([23, 19, 17, 23])
np.multiply(x, y) # 相當於 x * y
array([132, 90, 52, 120])
np.maximum(x,y) # 兩個陣列元素級最大值的比較
array([12, 10, 13, 15])
np.greater(x, y) # 執行元素級的比較操作 如果 x > y,則返回True,否則返回False
array([ True, False, True, True])
1.8 利用NumPy陣列進行資料處理
1.8.1 將條件邏輯轉為陣列運算
x
array([12, 9, 13, 15])
y
array([11, 10, 4, 8])
con = np.array([True,True,False,False])
result = np.where(con,x,y) #True 則返回x中的元素,False 則返回y中的元素
result
array([12, 9, 4, 8])
1.8.2 陣列統計運算
data18
array([ 1, 4, 9, 16])
data18.sum() # 求和
30
data18.mean() # 求平均值
7.5
data18.min() #求最小值
1
data18.max() #求最大值
16
data18.argmin() #最小值的索引
0
data18.argmax() #最大值的索引
3
data18.cumsum() #計算陣列的累加和
array([ 1, 5, 14, 30], dtype=int32)
data18.cumprod() #計算陣列的階乘
array([ 1, 4, 36, 576], dtype=int32)
x = np.arange(1 , 16).reshape((3 , 5))
x
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
np.diff(x,axis=0) #後一個數值減去前一個,axis=0表示按照 行 操作,不指定的話按照 列 操作。
array([[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5]])
np.diff(x,axis=1) #後一個數值減去前一個,axis=0表示按照 列 操作。
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
取整
np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7]) #向左取整
array([-1., -2., -1., -2., 0., 1., 1.])
np.ceil([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7]) #向右取整
array([-0., -1., -0., -1., 0., 2., 2.])
查詢,利用np.where實現小於0的值用0填充嗎,大於0的數不變!
x = np.array([[1, 0],[2, -2],[-2, 1]])
print(x)
[[ 1 0]
[ 2 -2]
[-2 1]]
np.where(x>0,x,0)
array([[1, 0],
[2, 0],
[0, 1]])
1.8.3 陣列排序
data19 = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])
data19
array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])
data19.sort()
data19
array([[2, 6, 7],
[2, 3, 6],
[2, 3, 4]])
data19 = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])
print(data19)
[[6 2 7]
[3 6 2]
[4 3 2]]
data19.sort(0) #以第零列為標準,進行排序
data19
array([[3, 2, 2],
[4, 3, 2],
[6, 6, 7]])
1.8.4 檢索陣列元素
data20 = np.array([[1, -2, -7], [-3, 6, 2], [-4, 3, 2]])
data20
array([[ 1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])
np.any(data20 > 0) # arr的所有元素是否有一個大於0
True
np.all(data20 > 0) # arr的所有元素是否都大於0
False
1.8.5 唯一化及其他集合邏輯
data21 = np.array([12, 11, 34, 23, 12, 8, 11])
np.unique(data21) #去重
array([ 8, 11, 12, 23, 34])
np.in1d(data21,[11,12]) #若陣列data21中的元素,為11或者12,返回True,否則返回False
array([ True, True, False, False, True, False, True])
1.9 線性代數模組
x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[1, 2], [3, 4], [5, 6]])
x.dot(y) #線性代數中 矩陣x * 矩陣y
array([[22, 28],
[49, 64]])
1.10隨機數模組
np.random.rand(3,3) # 隨機生成一個3*3的二維陣列
array([[0.880182 , 0.80619983, 0.89338209],
[0.95397872, 0.07484697, 0.69381484],
[0.66932997, 0.81346976, 0.69450861]])
np.random.rand(2, 3, 3) # 隨機生成一個2*3*3三維陣列
array([[[0.6498411 , 0.73851041, 0.75853755],
[0.26874959, 0.98528431, 0.55123651],
[0.89348645, 0.63671576, 0.62152188]],
[[0.19524857, 0.08290215, 0.11137754],
[0.50801958, 0.06208007, 0.12890112],
[0.94341486, 0.13863547, 0.37279088]]])
np.random.seed(0) # 生成隨機數的種子
np.random.rand(5)
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
np.random.seed(0) # 隨機數種子相同的話,生成的陣列也相同
np.random.rand(5)
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
np.random.seed(2) # 隨機數種子相同的話,生成的陣列也相同
np.random.rand(5)
array([0.4359949 , 0.02592623, 0.54966248, 0.43532239, 0.4203678 ])