Python | Numpy | 初始化,維度,資料型別,複製,取值賦值
阿新 • • 發佈:2019-02-13
初始化
1、從list初始化一個ndarray
arr = np.array([1, 2, 3]) #list轉ndarry
li =arr.tolist() #ndarry轉list
print(type(arr),type(li))
<class 'numpy.ndarray'> <class 'list'>
2、通過內建函式初始化
arr = np.zeros((2, 3)) #初始化一個2*3的元素全為0的陣列 arr = np.ones((1, 2)) #初始化一個1*2的元素全為1的陣列 arr = np.full((2, 2), 8) #初始化一個2*2的元素全為8的陣列 arr = np.eye(3) #初始化一個3*3 的對角線元素為1,其餘全為0的陣列(單位矩陣) arr = np.random.random((3, 2)) #初始化一個3*2的,填充任意數字的陣列 arr = np.empty((2, 3, 4)) #初始化一個2*3*4的陣列,不填充
檢視陣列的維度
arr = np.array([[1, 2, 3],[4, 5, 6]])
print(arr,'\n\n' ,arr.shape)
[[1 2 3]
[4 5 6]]
(2, 3)
定義及檢視陣列中資料的型別
numpy在初始化陣列時會自動匹配合適的型別,但也可指定
arr1 = np.array([[1, 2, 3],[4, 5, 6]]) arr2 = np.array([[1, 2, 3],[4, 5, 6]],dtype=np.float) #指定資料型別為float print(arr1,'\n' ,arr1.dtype) #檢視arr1的資料的型別 print() print(arr2,'\n' ,arr2.dtype) #檢視arr2的資料的型別
[[1 2 3]
[4 5 6]]
int32
[[1. 2. 3.]
[4. 5. 6.]]
float64
使用astype()複製陣列並轉換資料型別
arr = np.array([[1, 2, 3],[4, 5, 6]])
float_arr = arr.astype(np.float64)
print(arr.dtype,float_arr.dtype)
int32 float64
注:使用astype()將float轉換為int時,小數部分將被捨棄
字串型別的數字可轉為數值型,有其他字元則會報錯
astype()使用其他陣列型別作為引數
int_arr = np.array([1, 2, 3]) float_arr = np.array([1.2, 2.5, 6.1]) print(float_arr.astype(dtype=int_arr.dtype))
[1 2 6]
陣列內元素取值和賦值
1、像list一樣切片
(注意切片結果不同)
a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
b = a[1,:] #[4 5 6]
c = a[1:2,:] #[[4 5 6]]
d = a[[1],:] #[[4 5 6]]
注意此時相當於引用,修改b、c、d的值都會修改a
c[0][0] += 10
print(c,'\n\n',a)
[[14 5 6]]
[[ 1 2 3]
[14 5 6]
[ 7 8 9]]
若不想使用引用,則應使用copy():
a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
c = a[1:2,:].copy() #[[4 5 6]]
c[0][0] += 10
print(c,'\n\n',a)
[[14 5 6]]
[[1 2 3]
[4 5 6]
[7 8 9]]
2、更靈活的方法
a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
b = a[[0, 1, 2],[1, 0, 2]]
print(a,'\n\n',b)
[[1 2 3]
[4 5 6]
[7 8 9]]
[2 4 9]
3、條件判斷
a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
print(a[a>2])
#上面相當於:
bool_index = (a > 2) #定義一個bool索引
print(a[bool_index])
[3 4 5 6 7 8 9]
[3 4 5 6 7 8 9]
但是這樣會損失維度資訊