筆記1:利用python進行資料分析
阿新 • • 發佈:2018-11-22
#筆記1:利用python進行資料分析
numpy模組,各種函式等等
因為不想使用編碼軟體,所以直接文字編輯器,cmd執行結果;
提一個小技巧:cmd中複製資訊操作,右擊–》標記–》選擇需要複製的資訊(一般為白色背景)–》在複製區外右擊,之後在需要的地方-》ctrl+v 就可以了;
直接上碼:
import numpy as np import matplotlib.pyplot as plt print('list轉換成numpy陣列--array') data1 = [6, 7.5, 8, 0, 1] arr1 = np.array(data1) print('array:',arr1) print('np:ndim--陣列維數的維,shape--陣列維數統計') print('以下一一驗證') data2=[[1,2,3,4,5],[6,7,8,9,10]] data22=[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]] arr2=np.array(data2) print(arr2) print('ndim:',arr2.ndim) print('shape:',arr2.shape) arr22=np.array(data22) print(arr22) print('ndim:',arr22.ndim) print('shape:',arr22.shape) data23=[[[1,2,3,4,5],[1,2,3,4,5]],[[6,7,8,9,10],[6,7,8,9,10]],[[11,12,13,14,15],[11,12,13,14,15]]] arr23=np.array(data23) print(arr23) print('ndim:',arr23.ndim) print('shape:',arr23.shape) print('判定numpy的陣列型別--dtype,也可以用於資料型別轉換') print(arr1.dtype) print(arr2.dtype) print('arr.astype(np.float32)') print('numpy陣列函式:zeros--生成數值為0的陣列,ones--為1,empyt--未初始化的攔擊值,——like--陣列複製') arr3=np.zeros(10) arr4=np.ones(10) arr5=np.zeros((3,6)) arr6=np.ones((2,5)) arr7=np.empty(10) arr8=np.empty((2,3,4)) arr10=np.ones_like(arr8) print('np.ones(10)',arr3) print('np.ones(10)',arr4) print('np.zeros((3,6))\n',arr5) print('np.ones((2,5))\n',arr6) print('np.empty(10)\n',arr7) print('np.empty((2,3,4))\n',arr8) print('np.ones_like(arr8)\n',arr10) print('numpy--範圍陣列') arr9=np.arange(15) print('np.arange(15)',arr9) print('eye--矩陣陣列,對角線數字為1,其他資料為零') arr11=np.eye(3,3) print('np.eye(3,3)\n',arr11) print('identity--矩陣陣列,對角線數字為1,其他資料為零') arr12=np.identity(5) print('np.identity(5)\n',arr12) print('list排序,sort是內建函式,其中引數reverse控制升降的序列') testlist=[9,5,4,8,7,6,3,11,55,99,66,88,44,33,12] print(testlist) testlist.sort() print(testlist) testlist.sort(reverse=True) print(testlist) #print(testlist.sort().reverse()) print('**********陣列及標量之間的運算***************') print('陣列切片') arr_slice=np.array([1,2,3,4,5,6,5]) print('切片:arr_slice[2:5]\n',arr_slice[2:5]) print(arr_slice) print('arr_slice[:] \n',arr_slice[:]) cc=20 print('獲取切片的副本而非檢視時,需要顯示覆制copy') cp=arr_slice[2].copy() print(cp) print('陣列執行,就是對整個資料元素級別的運算') print('arr_slice:\n',arr_slice) print('arr_slice+2:\n',arr_slice+2) print('陣列判斷,直接獲取boolon值,arr_slice==5:\n',arr_slice==5) data=np.random.randn(7,4) print(data) print(data[arr_slice==5]) print(data[[4,6]]) print('numpy --sqrt 平方根函式') arrsqrt=np.arange(10) print('arrsqrt\n',arrsqrt) print('np.sqrt(arrsqrt)\n',np.sqrt(arrsqrt)) print('np.exp(arrsqrt)\n',np.exp(arrsqrt)) print('元素級最大值--maximum') x=np.random.randn(8) y=np.random.randn(8) print('x 和 y 的值:',x,'\n',y) print('np.maximum(x,y):\n',np.maximum(x,y)) print('nodf--將陣列的小數和整數部分一2個獨立資料形式返回') arrmodf=np.random.randn(7)*5 print('arrmodf:\n',arrmodf) print('np.modf(arrmodf):\n',np.modf(arrmodf))
結果展示:
list轉換成numpy陣列--array array: [6. 7.5 8. 0. 1. ] np:ndim--陣列維數的維,shape--陣列維數統計 以下一一驗證 [[ 1 2 3 4 5] [ 6 7 8 9 10]] ndim: 2 shape: (2, 5) [[ 1 2 3 4 5] [ 6 7 8 9 10] [11 12 13 14 15]] ndim: 2 shape: (3, 5) [[[ 1 2 3 4 5] [ 1 2 3 4 5]] [[ 6 7 8 9 10] [ 6 7 8 9 10]] [[11 12 13 14 15] [11 12 13 14 15]]] ndim: 3 shape: (3, 2, 5) 判定numpy的陣列型別--dtype,也可以用於資料型別轉換 float64 int32 arr.astype(np.float32) numpy陣列函式:zeros--生成數值為0的陣列,ones--為1,empyt--未初始化的攔擊值,— —like--陣列複製 np.ones(10) [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] np.ones(10) [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] np.zeros((3,6)) [[0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0.]] np.ones((2,5)) [[1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.]] np.empty(10) [2.71336269e+209 8.18497806e-119 3.53364474e+246 8.49357523e-119 6.38796479e+029 5.98129881e-154 1.58456326e+029 1.00887452e-109 9.63197468e-196 8.54094678e+197] np.empty((2,3,4)) [[[2.22523004e-307 1.24610994e-306 9.34605037e-307 1.37960283e-306] [3.56043054e-307 1.37961641e-306 2.22518251e-306 1.33511969e-306] [1.05694828e-307 1.11261027e-306 1.11261502e-306 1.42410839e-306]] [[7.56597770e-307 6.23059726e-307 1.42420481e-306 1.24612013e-306] [6.89804132e-307 8.34447260e-308 1.16820707e-307 1.33511562e-306] [1.42410974e-306 1.00132228e-307 1.33511969e-306 2.18568966e-312]]] np.ones_like(arr8) [[[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]] [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]] numpy--範圍陣列 np.arange(15) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] eye--矩陣陣列,對角線數字為1,其他資料為零 np.eye(3,3) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] identity--矩陣陣列,對角線數字為1,其他資料為零 np.identity(5) [[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]] list排序,sort是內建函式,其中引數reverse控制升降的序列 [9, 5, 4, 8, 7, 6, 3, 11, 55, 99, 66, 88, 44, 33, 12] [3, 4, 5, 6, 7, 8, 9, 11, 12, 33, 44, 55, 66, 88, 99] [99, 88, 66, 55, 44, 33, 12, 11, 9, 8, 7, 6, 5, 4, 3] **********陣列及標量之間的運算*************** 陣列切片 切片:arr_slice[2:5] [3 4 5] [1 2 3 4 5 6 5] arr_slice[:] [1 2 3 4 5 6 5] 獲取切片的副本而非檢視時,需要顯示覆制copy 3 陣列執行,就是對整個資料元素級別的運算 arr_slice: [1 2 3 4 5 6 5] arr_slice+2: [3 4 5 6 7 8 7] 陣列判斷,直接獲取boolon值,arr_slice==5: [False False False False True False True] [[ 1.47253514 -2.44902682 1.13812205 0.14589991] [ 0.68373373 -0.23366184 -0.27223464 1.71469428] [-0.07041122 0.62303681 0.95898338 -0.81384621] [-1.06898661 0.627502 -0.23341503 0.65571662] [ 0.58839865 -0.75535174 -0.35730241 -0.34919981] [ 1.68777775 -0.30818458 2.04453755 -1.57759168] [ 0.71897125 1.73441183 0.65232242 -0.06775045]] [[ 0.58839865 -0.75535174 -0.35730241 -0.34919981] [ 0.71897125 1.73441183 0.65232242 -0.06775045]] [[ 0.58839865 -0.75535174 -0.35730241 -0.34919981] [ 0.71897125 1.73441183 0.65232242 -0.06775045]] numpy --sqrt 平方根函式 arrsqrt [0 1 2 3 4 5 6 7 8 9] np.sqrt(arrsqrt) [0. 1. 1.41421356 1.73205081 2. 2.23606798 2.44948974 2.64575131 2.82842712 3. ] np.exp(arrsqrt) [1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01 5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03 2.98095799e+03 8.10308393e+03] 元素級最大值--maximum x 和 y 的值: [ 0.17431847 0.28680556 1.85782297 1.03780585 -1.22376584 0.48 353147 0.95340868 -0.61662407] [-0.65832693 0.53254895 -0.76633331 -0.46840485 -0.99966711 0.53170305 0.46197655 -1.07052881] np.maximum(x,y): [ 0.17431847 0.53254895 1.85782297 1.03780585 -0.99966711 0.53170305 0.95340868 -0.61662407] nodf--將陣列的小數和整數部分一2個獨立資料形式返回 arrmodf: [ 3.69746112 -0.19319961 -3.28349768 -0.17373054 0.37827685 4.32382365 -0.26977041] np.modf(arrmodf): (array([ 0.69746112, -0.19319961, -0.28349768, -0.17373054, 0.37827685, 0.32382365, -0.26977041]), array([ 3., -0., -3., -0., 0., 4., -0.]))
陣列運算部分:
print('****************利用陣列進行資料處理****************************') points=np.arange(-5,5,0.01) xs,ys=np.meshgrid(points,points) print(xs,'\n',ys) z=np.sqrt(xs ** 2+ys ** 2) print(z) #plt.imshow(z,cmap=plt.cm.gray) plt.imshow(z) plt.colorbar() plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values") #plt.show() print('********將條件邏輯表述為陣列運算**************') print('where是函式三元表示式的向量化版本 x if condition else y') xarr=np.random.randn(5)+1 yarr=np.random.randn(5)+2 cond=yarr<2 print('三組資料 xarr,yarr,cond:\n',xarr,'\n',yarr,'\n',cond) print('np.where(cond,yarr,xarr):\n',np.where(cond,yarr,xarr)) print('也可用於資料替換') arrn=np.random.randn(4,4) print('arrn:\n',arrn) print('np.where(arrn>0,2,-2):\n',np.where(arrn>0,2,-2)) print('最猛的where表示式:np.where(x & y,0,np.where(x,1,np.where(y,2,3)))') print('**************數學和統計方法***************************') arrstatistics=np.random.randn(4,5) print('np.random.randn(5,4):\n',np.random.randn(5,4)) print('平均數mean():\n',arrstatistics.mean()) print('和sum():\n',arrstatistics.sum()) print('axis引數,定義統計位置,統計的維度') print('平均數mean(axis=1):\n',arrstatistics.mean(axis=1)) print('和sum(axis=0):\n',arrstatistics.sum(axis=0)) print('累計求和cumsum和求積cumprod,其中的引數定義是統計的維度') arrcum=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) print('原始資料:\n',arrcum) print('np.shape(arrcum):\n',np.shape(arrcum)) print('cumsum累計求和,arrcum.cumsum(0):\n',arrcum.cumsum(0)) print('cumprod累計求積,arrcum.cumprod(0):\n',arrcum.cumprod(0)) print('cumsum累計求和,arrcum.cumsum(1):\n',arrcum.cumsum(1)) print('cumprod累計求積,arrcum.cumprod(1):\n',arrcum.cumprod(1)) print('******************用於boolean陣列的方法*************') print('在python中有時boolean是可以與0 1相互使用的') arrbool=np.random.randn(10) print('(np.random.randn(100)>0).sum():\n',(arrbool>0).sum()) bools=arrbool>0 print('boolean陣列:\n',bools) print('bools.any()判斷陣列中是否有true:',bools.any()) print('bools.all()判斷陣列中是否全部是true:',bools.all()) print('\n**************排序*****************\n') print('sort可以排序,陣列可以按照軸向上排序') arrsort=np.random.randn(8) print('np.random.randn(8):\n',arrsort) arrsort.sort() print('sort()排序,同時sort是內建函式:\n',arrsort) arrsort2=np.random.randn(3,4) print('np.random.randn(3,4):\n',arrsort2) arrsort2.sort(1) print('陣列排序,按照維度,arrsort2.sort(0):\n',arrsort2) sortnp=np.random.randn(5) print(np.sort(sortnp)) print('\n**********唯一化以及其他的集合邏輯*******************\n') print('類似於陣列去重且排序') names=np.array(['bob','joe','will','lily','will','joe']) print('陣列:\n',names) print('np.unique(names)陣列去重且排序:\n',np.unique(names))
結果展示:
****************利用陣列進行資料處理****************************
[[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
...
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]]
[[-5. -5. -5. ... -5. -5. -5. ]
[-4.99 -4.99 -4.99 ... -4.99 -4.99 -4.99]
[-4.98 -4.98 -4.98 ... -4.98 -4.98 -4.98]
...
[ 4.97 4.97 4.97 ... 4.97 4.97 4.97]
[ 4.98 4.98 4.98 ... 4.98 4.98 4.98]
[ 4.99 4.99 4.99 ... 4.99 4.99 4.99]]
[[7.07106781 7.06400028 7.05693985 ... 7.04988652 7.05693985 7.06400028]
[7.06400028 7.05692568 7.04985815 ... 7.04279774 7.04985815 7.05692568]
[7.05693985 7.04985815 7.04278354 ... 7.03571603 7.04278354 7.04985815]
...
[7.04988652 7.04279774 7.03571603 ... 7.0286414 7.03571603 7.04279774]
[7.05693985 7.04985815 7.04278354 ... 7.03571603 7.04278354 7.04985815]
[7.06400028 7.05692568 7.04985815 ... 7.04279774 7.04985815 7.05692568]]
********將條件邏輯表述為陣列運算**************
where是函式三元表示式的向量化版本 x if condition else y
三組資料 xarr,yarr,cond:
[ 1.26243408 1.48311738 -0.07536512 2.18532806 1.18377716]
[ 3.61416886 0.7816586 -0.08830427 2.62565609 2.85934403]
[False True True False False]
np.where(cond,yarr,xarr):
[ 1.26243408 0.7816586 -0.08830427 2.18532806 1.18377716]
也可用於資料替換
arrn:
[[ 0.94335461 -0.58049987 2.38113548 0.49852662]
[-0.54994948 -0.31994696 0.27155128 -0.1202289 ]
[-0.25684742 -0.46311334 0.0054203 -0.07023138]
[-1.3216416 0.61327913 -1.04011719 1.41598978]]
np.where(arrn>0,2,-2):
[[ 2 -2 2 2]
[-2 -2 2 -2]
[-2 -2 2 -2]
[-2 2 -2 2]]
最猛的where表示式:np.where(x & y,0,np.where(x,1,np.where(y,2,3)))
**************數學和統計方法***************************
np.random.randn(5,4):
[[ 0.70970748 -0.4591139 -1.15833358 -0.78405139]
[ 0.46591102 0.35339858 -2.06302841 -0.02693571]
[-1.20844434 -0.64084241 0.75429817 0.93858619]
[ 0.23871791 -0.25767499 -0.59621739 -0.44097582]
[-0.51131581 0.58601802 0.03373255 1.36768605]]
平均數mean():
-0.28012726860314613
和sum():
-5.602545372062923
axis引數,定義統計位置,統計的維度
平均數mean(axis=1):
[-0.74247505 -0.16217004 -0.04852818 -0.1673358 ]
和sum(axis=0):
[-1.02138047 -0.23966593 -1.48753698 0.88226155 -3.73622355]
累計求和cumsum和求積cumprod,其中的引數定義是統計的維度
原始資料:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
np.shape(arrcum):
(3, 4)
cumsum累計求和,arrcum.cumsum(0):
[[ 1 2 3 4]
[ 6 8 10 12]
[15 18 21 24]]
cumprod累計求積,arrcum.cumprod(0):
[[ 1 2 3 4]
[ 5 12 21 32]
[ 45 120 231 384]]
cumsum累計求和,arrcum.cumsum(1):
[[ 1 3 6 10]
[ 5 11 18 26]
[ 9 19 30 42]]
cumprod累計求積,arrcum.cumprod(1):
[[ 1 2 6 24]
[ 5 30 210 1680]
[ 9 90 990 11880]]
******************用於boolean陣列的方法*************
在python中有時boolean是可以與0 1相互使用的
(np.random.randn(100)>0).sum():
4
boolean陣列:
[ True False False True True False False False False True]
bools.any()判斷陣列中是否有true: True
bools.all()判斷陣列中是否全部是true: False
**************排序*****************
sort可以排序,陣列可以按照軸向上排序
np.random.randn(8):
[ 0.20910574 0.40382178 1.8342204 1.25804787 -0.93640235 -1.02153225
1.52891234 1.37000349]
sort()排序,同時sort是內建函式:
[-1.02153225 -0.93640235 0.20910574 0.40382178 1.25804787 1.37000349
1.52891234 1.8342204 ]
np.random.randn(3,4):
[[-0.18118097 2.28582324 -0.78561753 1.02404558]
[ 0.40045074 0.72130552 -0.34748332 0.16252639]
[ 0.24651261 1.24463897 -0.30033206 -1.22524984]]
陣列排序,按照維度,arrsort2.sort(0):
[[-0.78561753 -0.18118097 1.02404558 2.28582324]
[-0.34748332 0.16252639 0.40045074 0.72130552]
[-1.22524984 -0.30033206 0.24651261 1.24463897]]
[-2.06422161 -1.33899749 -0.72697942 0.04606701 0.65161994]
E:\JAVA\Idea-workspace\python\data_see>python numpy_test01.py
****************利用陣列進行資料處理****************************
[[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
...
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]
[-5. -4.99 -4.98 ... 4.97 4.98 4.99]]
[[-5. -5. -5. ... -5. -5. -5. ]
[-4.99 -4.99 -4.99 ... -4.99 -4.99 -4.99]
[-4.98 -4.98 -4.98 ... -4.98 -4.98 -4.98]
...
[ 4.97 4.97 4.97 ... 4.97 4.97 4.97]
[ 4.98 4.98 4.98 ... 4.98 4.98 4.98]
[ 4.99 4.99 4.99 ... 4.99 4.99 4.99]]
[[7.07106781 7.06400028 7.05693985 ... 7.04988652 7.05693985 7.06400028]
[7.06400028 7.05692568 7.04985815 ... 7.04279774 7.04985815 7.05692568]
[7.05693985 7.04985815 7.04278354 ... 7.03571603 7.04278354 7.04985815]
...
[7.04988652 7.04279774 7.03571603 ... 7.0286414 7.03571603 7.04279774]
[7.05693985 7.04985815 7.04278354 ... 7.03571603 7.04278354 7.04985815]
[7.06400028 7.05692568 7.04985815 ... 7.04279774 7.04985815 7.05692568]]
********將條件邏輯表述為陣列運算**************
where是函式三元表示式的向量化版本 x if condition else y
三組資料 xarr,yarr,cond:
[ 0.99007268 -1.11880488 -0.38605399 0.59386976 1.70623461]
[1.61854825 0.6337754 1.93116283 2.87717606 2.85241642]
[ True True True False False]
np.where(cond,yarr,xarr):
[1.61854825 0.6337754 1.93116283 0.59386976 1.70623461]
也可用於資料替換
arrn:
[[-0.20398996 0.11794209 0.0227026 1.71716702]
[-0.79731314 1.26415283 1.44153618 0.04418537]
[-0.38009871 -0.99222962 -1.52615044 0.83931967]
[-1.19255679 0.96093554 -0.48774968 -0.71865748]]
np.where(arrn>0,2,-2):
[[-2 2 2 2]
[-2 2 2 2]
[-2 -2 -2 2]
[-2 2 -2 -2]]
最猛的where表示式:np.where(x & y,0,np.where(x,1,np.where(y,2,3)))
**************數學和統計方法***************************
np.random.randn(5,4):
[[-1.70376598 -0.50234601 1.55523975 -1.10212304]
[-0.45373985 0.00948484 0.28416607 -0.62475218]
[ 0.08600197 -0.20475063 -0.11132531 0.13814797]
[-0.32343823 -2.93497135 -0.08099377 1.50397584]
[ 0.02241948 0.91416485 1.44763277 1.0781573 ]]
平均數mean():
-0.18957174296527549
和sum():
-3.7914348593055096
axis引數,定義統計位置,統計的維度
平均數mean(axis=1):
[-0.36809082 -0.46193983 -0.73314166 0.80488534]
和sum(axis=0):
[-0.81198514 -1.18956475 -0.06381854 1.59453648 -3.32060291]
累計求和cumsum和求積cumprod,其中的引數定義是統計的維度
原始資料:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
np.shape(arrcum):
(3, 4)
cumsum累計求和,arrcum.cumsum(0):
[[ 1 2 3 4]
[ 6 8 10 12]
[15 18 21 24]]
cumprod累計求積,arrcum.cumprod(0):
[[ 1 2 3 4]
[ 5 12 21 32]
[ 45 120 231 384]]
cumsum累計求和,arrcum.cumsum(1):
[[ 1 3 6 10]
[ 5 11 18 26]
[ 9 19 30 42]]
cumprod累計求積,arrcum.cumprod(1):
[[ 1 2 6 24]
[ 5 30 210 1680]
[ 9 90 990 11880]]
******************用於boolean陣列的方法*************
在python中有時boolean是可以與0 1相互使用的
(np.random.randn(100)>0).sum():
2
boolean陣列:
[ True True False False False False False False False False]
bools.any()判斷陣列中是否有true: True
bools.all()判斷陣列中是否全部是true: False
**************排序*****************
sort可以排序,陣列可以按照軸向上排序
np.random.randn(8):
[-0.02345675 0.64359727 0.58457296 -0.8850154 2.44578301 -1.08562018
0.17500176 -0.71670191]
sort()排序,同時sort是內建函式:
[-1.08562018 -0.8850154 -0.71670191 -0.02345675 0.17500176 0.58457296
0.64359727 2.44578301]
np.random.randn(3,4):
[[-1.68676702 -0.36451105 -2.64072687 0.21919304]
[ 1.68514211 1.80208532 2.23261514 -0.21684161]
[ 1.93498362 -0.53826307 0.00436807 1.48078029]]
陣列排序,按照維度,arrsort2.sort(0):
[[-2.64072687 -1.68676702 -0.36451105 0.21919304]
[-0.21684161 1.68514211 1.80208532 2.23261514]
[-0.53826307 0.00436807 1.48078029 1.93498362]]
[-0.58380263 -0.25613384 -0.18538389 0.02038693 3.28734033]
**********唯一化以及其他的集合邏輯*******************
類似於陣列去重且排序
陣列:
['bob' 'joe' 'will' 'lily' 'will' 'joe']
np.unique(names)陣列去重且排序:
['bob' 'joe' 'lily' 'will']```