資料分析—numpy
(https://blog.csdn.net/taiyang5946/article/details/77859851)用numpy時要注意縮排,頂頭寫
否者報錯。
a_list = range(10)
b_list = range(10)# 把兩個列表中的元素一一對應相乘,把結果放在列表中\n
c_list = []
for x in range(len(a_list)):
# 根據x的值 取出列表中的資料 相乘 結果放入c列表中\n",
c = a_list[x] * b_list[x]
c_list.append(c)
print(c_list)
[0] [0, 1] [0, 1, 4] [0, 1, 4, 9] [0, 1, 4, 9, 16] [0, 1, 4, 9, 16, 25] [0, 1, 4, 9, 16, 25, 36] [0, 1, 4, 9, 16, 25, 36, 49] [0, 1, 4, 9, 16, 25, 36, 49, 64] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 引入numpy,重新命名為np\n
import numpy as np
# 生成一個numpy中的一維陣列
# numpy中的陣列,儲存的所有資料必須是同質(相同型別)的
a_arr = np.arange(10)
print(a_arr)
b_arr = np.arange(10)
# 直接使用陣列做向量運算的,會把運算作用到陣列中的每一個元素中
c_arr = a_arr * b_arr
print(c_arr)
執行結果:
[0 1 2 3 4 5 6 7 8 9] [ 0 1 4 9 16 25 36 49 64 81]
import numpy as np
data = np.random.rand(2,3)print(data)
print('維度個數',data.ndim)
print('各維度大小',data.shape)
print('資料型別',data.dtype)
執行結果:
[[0.99220889 0.99680282 0.51083921] [0.98437702 0.9869212 0.82989925]] 維度個數 2 各維度大小 (2, 3) 資料型別 float64
# python中列表轉換numpy中的陣列
l1 = range(10)
print(type(l1))
# 轉換為陣列
arr = np.array(l1)
print(type(arr))
print(arr.ndim)
print(arr.shape)
print(arr.dtype)
l2 = [range(10),range(10,20)]
print(type(l2))
arr = np.array(l2)
print(arr)
print(arr.ndim)
print(arr.shape)
print(arr.dtype)
<class 'list'> [[ 0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19]] 2 (2, 10) int32
# zeros() \\ ones() \\ empty()函式 建立陣列\n",
# 使用zeros()建立指定維度,指定資料型別的陣列\n",
# 1.維度資訊 2.指定型別\n",
# 如果不指定資料型別,預設全部是0.的float64的資料\n",
zeros_arr = np.zeros((2,3),np.int32)
print(zeros_arr)
print(zeros_arr.dtype)
# 使用ones()函式建立指定維度,指定資料類的陣列\n",
# 不指定資料型別,預設是全部為1的float64型別的資料\n",
ones_arr = np.ones((2,3),np.int32)
print(ones_arr)
# 使用empty()函式建立指定為度的陣列\n",
# 不指定資料型別,預設為全部為1的float64的資料\n",
empty_arr = np.empty((2,3))
print(empty_arr)
# 如果想要一個空字串的陣列,可以指定資料型別為np.str
empty_arr_str = np.empty((2,3),np.str)
print(empty_arr_str)
# 建立對角線資料全部為1的陣列
identity_arr = np.identity(3,dtype=np.int64)
print(identity_arr)
[[0 0 0] [0 0 0]] int32 [[1 1 1] [1 1 1]] [[0.99220889 0.99680282 0.51083921] [0.98437702 0.9869212 0.82989925]] [['' '' ''] ['' '' '']] [[1 0 0] [0 1 0] [0 0 1]]
zeros_arr = np.zeros((3,3),np.int64)
print(zeros_arr)
print(zeros_arr.dtype)
# astype()函式,轉換陣列中的資料型別
zeros_float_arr = zeros_arr.astype(np.float64)
print(zeros_float_arr)
print(zeros_float_arr.dtype)
# 儲存資料為小數型別,轉換為整數型別\n",
data_arr = np.array([1.45,2.34,3.14,5.5,6.6,3.1])
print(data_arr)
print(data_arr.dtype)
# 將float64資料型別轉換為整數int64型別,只保留整數部分\n",
int_data_arr = data_arr.astype(np.int64)
print(int_data_arr)
[[0 0 0] [0 0 0] [0 0 0]] int64 [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] float64 [1.45 2.34 3.14 5.5 6.6 3.1 ] float64 [1 2 3 5 6 3]
# 陣列的運算arr = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[4,5,6],[7,8,9]])
# 乘法運算 會把運算作用陣列中的每一個元素中\n",
print('乘法運算',arr*3)
# 乘方
print('乘方運算',arr**2)
# 矩陣(陣列)加減乘除運算\n",
print(arr+arr)
print(arr-arr2)
print(arr/arr2)
print(arr*arr2)
乘法運算 [[ 3 6 9] [12 15 18]] 乘方運算 [[ 1 4 9] [16 25 36]] [[ 2 4 6] [ 8 10 12]] [[-3 -3 -3] [-3 -3 -3]] [[0.25 0.4 0.5 ] [0.57142857 0.625 0.66666667]] [[ 4 10 18] [28 40 54]]
# BMI體重計算器,計算若干人員的身高體重比\n",
# BMI = 體重/身高(m)^2\n",
# 有兩個陣列,一個存放體重 一個存放身高 將身高體重一一計算,把計算結果放入陣列\n",
# 1.列表進行運算\n",
weight_list = [65,75,85]
height_list = [1.7,1.75,1.8]
result =[]
for x in range(len(weight_list)):
bmi = weight_list[x]/(height_list[x]*height_list[x])
result.append(bmi)
print(result)
# 2.array資料運算\n",
w_arr = np.array(weight_list)
h_arr = np.array(height_list)
# 直接使用陣列做向量運算\n",
rs_arr = w_arr/(h_arr**2)
print(rs_arr)
# 表示式返回的是存放布林型別化資料陣列\n",
is_ok = rs_arr >=23
print(is_ok)
print(is_ok.dtype)
# 通過is_ok資料可以將陣列中資料取出來\n",
# 取出bmi大於等23的身高和體重\n",
# 把True對應的資料取出來\n",
w_rs = w_arr[is_ok]
print(w_rs)
h_rs = h_arr[is_ok]
print(h_rs)
[22.49134948096886] [22.49134948 24.48979592 26.2345679 ] [False True True] bool [75 85] [1.75 1.8 ] [22.49134948096886, 24.489795918367346] [22.49134948 24.48979592 26.2345679 ] [False True True] bool [75 85] [1.75 1.8 ] [22.49134948096886, 24.489795918367346, 26.234567901234566] [22.49134948 24.48979592 26.2345679 ] [False True True] bool [75 85] [1.75 1.8 ]
year_arr = np.array([
[2000,2013,2015],
[2008,2019,2007],
[2010,2012,2017]
])
# 篩選出大於等於2015的年份\n",
is_year_after = year_arr >= 2015
print(is_year_after)
# 根據篩選的結果布林資料取出資料\n",
filter_year = year_arr[is_year_after]
print(filter_year)
# 等同於上面的寫法\n",
filter_year = year_arr[year_arr>=2015]
print(filter_year)
print('-----------------------------------------------')
# 多個條件同時成立\n",
filter_year = year_arr[(year_arr>=2007) & (year_arr%4==0)]
print(filter_year)
# 多個條件有一個成立即可 | 或者\n",
filter_year = year_arr[(year_arr>=2007) | (year_arr%2==0)]
print(filter_year)
[[False False True] [False True False] [False False True]] [2015 2019 2017] [2015 2019 2017] ----------------------------------------------- [2008 2012] [2000 2013 2015 2008 2019 2007 2010 2012 2017]
# 陣列的切片\n",
arr = np.arange(10)
print(arr)
# 資料中的索引從0開始,依次+1\n",
print(arr[3])
# 切片\
print(arr[2:5])
print(arr[:5])
print(arr[2:])
print(arr[2::3])
[0 1 2 3 4 5 6 7 8 9] 3 [2 3 4] [0 1 2 3 4] [2 3 4 5 6 7 8 9] [2 5 8]# reshape()把一維陣列轉換為多維陣列\n",
# 轉換之後的資料總個數必須等於轉換之前的個數\n",
arr2 = np.arange(12).reshape(3,4)
print(arr2)
# 多維陣列通過組合索引取值\n",
print(arr2[1,1])
# 切片\n",
print(arr2[0:2])
print(arr2[0:2,2:])
print(arr2[:,1:3])
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 5 [[0 1 2 3] [4 5 6 7]] [[2 3] [6 7]] [[ 1 2] [ 5 6] [ 9 10]]
arr3 = np.random.rand(2,3)
print(arr3)
print(arr3.ndim),
print(arr3.shape)
# 轉置之後,將陣列中的各個索引資料對應結合\n",
arr4 = arr3.transpose()
print(arr4)
print(arr4.ndim)
print(arr4.shape)
# 多維陣列轉一維陣列\n",
arr5 = arr4.reshape(6)
print(arr5)
[[0.32211391 0.7809368 0.28596324] [0.83252519 0.52694696 0.03446635]] 2 (2, 3) [[0.32211391 0.83252519] [0.7809368 0.52694696] [0.28596324 0.03446635]] 2 (3, 2) [0.32211391 0.83252519 0.7809368 0.52694696 0.28596324 0.03446635]