numpy模塊常用函數解析


https://blog.csdn.net/lm_is_dc/article/details/81098805

numpy模塊
以下命令都是在瀏覽器中輸入。
cmd命令窗口輸入:jupyter notebook
后打開瀏覽器輸入網址http://localhost:8888/

一、導入模塊
import numpy as np
1
查看numpy版本

np.__version__
1
Numpy可以提供數組支持以及相應的高效處理函數,是Python數據分析的基礎,也是SciPy、Pandas等數據處理和科學計算庫最基本的函數功能庫,且其數據類型對Python數據分析十分有用。

二、創建數組(ndarray)
1. 使用np.array()
參數為列表: 如[1, 4, 2, 5, 3]

arr1=np.array([1,2,3,4])
arr1 #點擊shift + Enter后可直接查看數組
1
2
1.1 查看變量的數據類型
type(arr1)
輸出:numpy.ndarray
1
2
1.2 創建二維數組
arr2= np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2
1
2
1.3 創建多維數組
如創建三維數組:

arry3=np.array([[[1,2,3],[4,5,6],[7,8,9]]])
arry3
1
2
1.4 注意
numpy默認ndarray的所有元素的類型是相同的
如果傳進來的列表中包含不同的類型,則統一為同一類型,優先級:str>float>int
如:

np.array([1,2,'a'])
輸出:array(['1', '2', 'a'],
dtype='<U11')
1
2
3
shape的使用:shape返回的是ndarray的數組形狀(返回類型是元組)。返回值的數據個數表示的就是數組的維度
arr2.shape
輸出:(3, 3) #意思是arr2是一個3行3列的數組
1
2
2、使用matplotlib.pyplot獲取一個numpy數組,數據來源於一張圖片
2.1、導入模塊
import matplotlib.pyplot as plt
1
2.2 讀取圖片
img=plt.imread(r'./虎.jpg') #img此時就是numpy.ndarray
img.shape
輸出:(369, 389, 3) #img形狀為三維數組,369*389像素,3代表顏色維度
1
2
3
type(img)
輸出:numpy.ndarray
1
2
2.3顯示圖片
plt.imshow(img)
plt.show()
1
2
2.4修改圖片
img_ecg=img-50 #img-50意思是每個元素減去50,數組值改變,圖片自然會改變
plt.imshow(img_ecg)
plt.show()
1
2
3
3、使用numpy的常見函數創建
包含以下常見創建方法:

3.1 np.ones(shape, dtype=None, order=’C’)
#創建2行2列的全部數值都為1的二維數組
arr= np.ones(shape=(2,2),dtype=int)
arr
輸出:array([[1, 1],
[1, 1]])
1
2
3
4
5
3.2 np.zeros(shape, dtype=None, order=’C’)
#創建2行3列的全部數值都為0的二維數組
arr=np.zeros([2,3])
arr
輸出:array([[ 0., 0., 0.],
[ 0., 0., 0.]])
1
2
3
4
5
3.3 np.full(shape, fill_value, dtype=None, order=’C’)
#創建2行3列的全部數值都為10的二維數組
#fill_value參數為數組填充的值
arr=np.full(shape=(2,4),fill_value=10,dtype=int)
arr
輸出:array([[10, 10, 10, 10],
[10, 10, 10, 10]])
1
2
3
4
5
6
3.4 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差數列
#數組初值為0,有10個值,終值為9
arr_linspace=np.linspace(start=0,stop=10,num=10,endpoint=False)
arr_linspace
輸出:array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
1
2
3
4
3.5 np.arange([start, ]stop, [step, ]dtype=None)
##數組初值為0,有5(10除以2)個值,終值為8,只能創建一維數組
arr_arange=np.arange(0,10,2)
arr_arange
輸出:array([0, 2, 4, 6, 8])
1
2
3
4
3.6 np.random.randint(low, high=None, size=None, dtype=’l’)
#創建一個隨機數在[10,90)的3行4列二維數組
#size=[3]則是一個一維數組,size=[3,4,5]則是三維數組
#隨機原理:根據當前系統的時間產生隨機數
#可以固定種子,使用seed(種子)函數
#np.random.seed(1)
np.random.randint(10,90,size=[3,4])
1
2
3
4
5
6
3.7 np.random.randn(d0, d1, …, dn) 標准正太分布
#創建一個10個元素的一維數組
np.random.randn(10)
1
2
#創建一個多維數組
#如創建10行,10列的數組
np.random.randn((10,10))
1
2
3
3.8 np.random.random(size=None)
生成[0,1)的隨機數

#創建一個2行2列的數值在[0,1)的二維數組
np.random.random(size=[2,2])
1
2
3.9 np.random.rand(d0,d1,…dn )
以給定的形狀創建一個數組,並在數組中加入在[0,1)之間均勻分布的隨機樣本。

np.random.rand(10)
1


np.random.rand(2,2)
1


3.10 np.eye(N, M=None, k=0, dtype=float)

#創建一個對角線為1的矩陣(二維數組)
arr_eys=np.eye(4)
arr_eys
輸出:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
1
2
3
4
5
6
7
8
9
三、ndarray的屬性
4個必記參數:

ndim:維度

shape:形狀(各維度的長度)

size:總長度

dtype:元素類型

arr_eys.ndim
輸出:2
1
2
arr_eys.shape
輸出:(4, 4) #4行4列的二維數組
1
2
arr_eys.size
輸出:16
1
2
arr_eys.dtype
輸出:dtype('float64')
1
2
type(arr_eys)
輸出:numpy.ndarray
1
2
四、ndarray的基本操作
1、 索引
通過下標來獲取元素。一維與列表完全一致 多維時同理 。

np.random.seed(10)
arr=np.random.randint(10,50,size=(3,4))
arr
輸出:
array([[19, 46, 25, 10],
[38, 35, 39, 39],
[18, 19, 10, 46]])
1
2
3
4
5
6
7
#索引
arr[1][2]
輸出:39
1
2
3
也根據索引修改數據 。

2 、切片
2.1 一個冒號:進行切片
通過冒號來切片,通過逗號來區分維度。一維與列表完全一致 多維時同理 。

#獲取前兩行數據
arr[0:2]
輸出:
array([[19, 46, 25, 10],
[38, 35, 39, 39]])
1
2
3
4
5
6
#獲取前兩行的前兩列數據
arr[0:2,0:2]
輸出:
array([[19, 46],
[38, 35]])
1
2
3
4
5
逗號左邊切的是第一個維度(行),逗號右邊切的是第二個維度(列)

#獲取二維數組前兩列數據
arr[:,0:2]
輸出:
array([[19, 46],
[38, 35],
[18, 19]])
1
2
3
4
5
6
2.2 兩個冒號::進行切片
一維

將數據反轉,例如[1,2,3]—->[3,2,1

#創建一維數組
arr=np.arange(0,10)
arr
輸出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
3
4
5
#反轉
arr[::-1]
輸出:
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
1
2
3
4
二維

#創建一個3行3列的二維數組
arr=np.linspace(0,9,num=9,endpoint=False).reshape((3,3))
arr
輸出:
array([[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.]])
1
2
3
4
5
6
7
#將數組的行倒序
arr[::-1]
輸出:
array([[ 6., 7., 8.],
[ 3., 4., 5.],
[ 0., 1., 2.]])
1
2
3
4
5
6
#將數組的列倒序
arr[:,::-1]
輸出:
array([[ 2., 1., 0.],
[ 5., 4., 3.],
[ 8., 7., 6.]])
1
2
3
4
5
6
#全倒置
arr[::-1,::-1]
輸出:
array([[ 8., 7., 6.],
[ 5., 4., 3.],
[ 2., 1., 0.]])
1
2
3
4
5
6
3、 圖片倒置
讀取圖片

import matplotlib.pyplot as plt
img=plt.imread(r'./虎.jpg')
type(img)
輸出:
numpy.ndarray
1
2
3
4
5
#顯示圖片
plt.imshow(img)
plt.show()
1
2
3


左右倒置圖片

img_lr=img[::,::-1]
plt.imshow(img_lr)
plt.show()
1
2
3


上下倒置圖片

img_ab=img[::-1]
plt.imshow(img_ab)
plt.show()
1
2
3


全倒置圖片

img_all=img[::-1,::-1]
plt.imshow(img_all)
plt.show()
1
2
3


4、變形
使用arr.reshape()函數,注意參數是一個tuple(元組)!

基本使用
4.1 將一維數組變形成多維數組
#創建一個隨機數在[1,800)的10個元素的一維數組
arr=np.random.randint(1,800,size=(10,))
arr.shape
輸出:(10,)
1
2
3
4
#將一維數組變形成2行5列的二維數組
arr2=arr.reshape((2,5))
arr2.shape
輸出:
(2, 5)
1
2
3
4
5
使用-1自動計算行數(或列數)

#將一維數組變形成2行5列的二維數組
arr2=arr.reshape((-1,5))
arr2.shape
輸出:
(2, 5)
1
2
3
4
5
#將一維數組變形成2行5列的二維數組
arr2=arr.reshape((2,-1))
arr2.shape
輸出:
(2, 5)
1
2
3
4
5
4.2 將多維數組變形成一維數組
#將arr2變形成一維數組
arr3=arr2.reshape(10)
arr3.shape
輸出:(10,)
1
2
3
4
使用-1自動計算元素個數

arr=arr2.reshape(-1)
arr.shape
輸出:(10,)
1
2
3
5、級聯
np.concatenate()
5.1、一維,二維,多維數組的級聯
一維

a1=np.array([1,2,3])
np.concatenate([a1,a1])
輸出:
array([1, 2, 3, 1, 2, 3])
1
2
3
4
#創建兩個二維數組
a1=np.random.randint(0,100,size=(3,4))
a2=np.random.randint(0,100,size=(3,4))
1
2
3
二維

#創建兩個二維數組
a1=np.random.randint(0,100,size=(3,4))
a2=np.random.randint(0,100,size=(3,4))
1
2
3
a1
輸出:
array([[18, 53, 32, 84],
[93, 28, 41, 26],
[30, 20, 47, 6]])
1
2
3
4
5
a2
輸出:
array([[14, 35, 15, 73],
[90, 16, 58, 51],
[69, 41, 4, 60]])
1
2
3
4
5
列跟列連在一起

#axis=0表示縱向(列跟列連接在一起)級聯
np.concatenate([a1,a2],axis=0)
輸出:
array([[18, 53, 32, 84],
[93, 28, 41, 26],
[30, 20, 47, 6],
[14, 35, 15, 73],
[90, 16, 58, 51],
[69, 41, 4, 60]])
1
2
3
4
5
6
7
8
9
行與行連接在一起

#axis=1表示橫向(行跟行連接在一起)級聯
np.concatenate([a1,a2],axis=1)
輸出:
array([[18, 53, 32, 84, 14, 35, 15, 73],
[93, 28, 41, 26, 90, 16, 58, 51],
[30, 20, 47, 6, 69, 41, 4, 60]])
1
2
3
4
5
6
axis參數的取值范圍:取值范圍是由級聯的數組維度決定的 (0-(維度-1))

級聯需要注意的點:

級聯的參數是列表:一定要加中括號或小括號
維度必須相同
形狀相符:在維度保持一致的前提下,如果進行橫向(axis=1)級聯,必須保證進行級聯的數組行數保持一致。如果進行縱向(axis=0)級聯,必須保證進行級聯的數組列數保持一致。
可通過axis參數改變級聯的方向
5.2 np.hstack與np.vstack
水平級聯與垂直級聯,代替axis參數。

np.hstack((a1,a2))
輸出:
array([[18, 53, 32, 84, 14, 35, 15, 73],
[93, 28, 41, 26, 90, 16, 58, 51],
[30, 20, 47, 6, 69, 41, 4, 60]])
1
2
3
4
5
np.vstack((a1,a2))
輸出:
array([[18, 53, 32, 84],
[93, 28, 41, 26],
[30, 20, 47, 6],
[14, 35, 15, 73],
[90, 16, 58, 51],
[69, 41, 4, 60]])
1
2
3
4
5
6
7
8
6、 合並照片
img=plt.imread(r'./虎.jpg')
img.shape
輸出:
(738, 389, 3)
1
2
3
4
plt.imshow(img)
plt.show()
1
2


#上下合並
img_v=np.concatenate((img,img),axis=0)
img_v.shape
輸出:
(738, 389, 3)
1
2
3
4
5
plt.imshow(img_v)
plt.show()
1
2


#左右合並
img_h=np.concatenate((img,img),axis=1)
img_h.shape
輸出:
(369, 778, 3)
1
2
3
4
5
plt.imshow(img_h)
plt.show()
1
2


7、 切分
與級聯類似,三個函數完成切分工作:

np.split(arr,行/列號,軸):參數2是一個列表類型
np.vsplit(arr,行/列號) 水平切
np.hsplit(arr,行/列號) 垂直切
返回值是一個列表
arr=np.array([[3,2,4],[9,5,8],[2,7,1]])
arr
輸出:
array([[3, 2, 4],
[9, 5, 8],
[2, 7, 1]])
1
2
3
4
5
6
np.split()

#切分第1、2列(下標從0開始),切兩刀,返回一個列表
np.split(arr,[1,2],axis=1)
輸出:
[array([[3],
[9],
[2]]), array([[2],
[5],
[7]]), array([[4],
[8],
[1]])]
1
2
3
4
5
6
7
8
9
10
np.vsplit()

#切分第1行(下標從0開始),切一刀,返回一個列表
np.vsplit(arr,[1])
輸出:
[array([[3, 2, 4]]), array([[9, 5, 8],
[2, 7, 1]])]
1
2
3
4
5
np.hsplit()

#切分第1列(下標從0開始),切一刀,返回一個列表
np.hsplit(arr,[1])
輸出:
[array([[3],
[9],
[2]]), array([[2, 4],
[5, 8],
[7, 1]])]
1
2
3
4
5
6
7
8
8、 切分照片
#axis=0,水平切
img=plt.imread(r'./虎.jpg')
img.shape
輸出:
(369, 389, 3)
1
2
3
4
5
img_list=np.split(img,[170],axis=0)
plt.imshow(img_list[0])
plt.show()
1
2
3


9、 副本
所有賦值運算不會為ndarray的任何元素創建副本。對賦值后的對象的操作也對原來的對象生效。

a=np.array([1,2,3,4,5])
a1=a
a[1]=222
a
輸出:
array([ 1, 222, 3, 4, 5])
1
2
3
4
5
6
a1
輸出:
array([ 1, 222, 3, 4, 5])
1
2
3
可使用copy()函數創建副本

a=np.array([1,2,3,4,5])
a1=a.copy()
1
2
a[1]=222
a
輸出:
array([ 1, 222, 3, 4, 5])
1
2
3
4
a1
輸出:
array([1, 2, 3, 4, 5])
1
2
3
10、 ravel() 數組扁平化
方式1:np.ravel(a,order=’C’)

方式2:ndarray.racel(order=’C’)

把多維數組扁平化成一維數組。參數’C’表示按行進行扁平,’F’表示按列進行扁平。

#創建二維數組
arr1=np.array([[1,2],[3,4]])
arr1
1
2
3


arr1.ravel(order='C')
1


arr1.ravel(order='F')
1


np.ravel(arr1)
1


np.ravel(arr1,order='F')
1


11、np.c_[arr1,arr2,…] 數組合並
把多個數組合並成一個數組。

arr1=np.array([1,2,3,4])
arr1
結果為:
array([1, 2, 3, 4])
1
2
3
4
np.c_[arr1,arr1]
結果為:
array([[1, 1],
[2, 2],
[3, 3],
[4, 4]])
1
2
3
4
5
6
多維數組:

#創建三維數組
arr2=np.array([[[1,2,3],[4,5,6],[7,8,9]]])
arr2
結果為:
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])
1
2
3
4
5
6
7
np.c_[arr2,arr2,arr2]
結果為:
array([[[1, 2, 3, 1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6, 4, 5, 6],
[7, 8, 9, 7, 8, 9, 7, 8, 9]]])
1
2
3
4
5
12、獲取數組不重復的值
np.unique(ar,return_counts=False)

參數ar:數組

參數return_counts:返回每個元素出現的次數

返回值是一個 元組。

arr=np.array([11,1,2,3,4,11,3,5])
np.unique(arr,return_counts=True)
1
2


13、使用dispkay()顯示多個數組
#導入包
from IPython.display import display
1
2
a=np.array([1,2,3,4])
b=np.array([5,6,7])
display(a,b)
1
2
3


五、ndarray的聚合操作
1、 求和np.sum
一維

arr=np.linspace(0,10,10,endpoint=False)
arr
輸出:
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
1
2
3
4
np.sum(arr,axis=0)
輸出:
45.0
1
2
3
二維

np.random.seed(8)
arr2=np.random.randint(0,10,size=(3,4))
arr2
輸出:
array([[3, 4, 1, 9],
[5, 8, 3, 8],
[0, 5, 1, 3]])
1
2
3
4
5
6
7
axis=0,列相加

np.sum(arr2,axis=0)
輸出:
array([ 8, 17, 5, 20])
1
2
3
axis=1,行相加

np.sum(arr2,axis=1)
輸出:
array([17, 24, 9])
1
2
3
2、 最大最小值:np.max/ np.min
np.random.seed(8)
arr2=np.random.randint(0,10,size=(3,4))
arr2
輸出:
array([[3, 4, 1, 9],
[5, 8, 3, 8],
[0, 5, 1, 3]])
1
2
3
4
5
6
7
axis=0,列最小值

np.min(arr2,axis=0)
輸出:
array([0, 4, 1, 3])
1
2
3
axis=1,行最小值

np.min(arr2,axis=1)
輸出:
array([1, 3, 0])
1
2
3
3、 平均值:np.mean()
arr2=np.array([[1,2,3],[3,4,5]])
arr2
輸出:
array([[1, 2, 3],
[3, 4, 5]])
1
2
3
4
5
axis=0,列平均值

np.mean(arr2,axis=0)
輸出:
array([ 2., 3., 4.])
1
2
3
axis=1,行平均值

np.mean(arr2,axis=1)
輸出:
array([ 2., 4.])
1
2
3
4、 其他聚合操作
Function Name NaN-safe Version Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power 冪運算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
六、ndarray的矩陣操作
1、 基本矩陣操作
1.1算術運算符:
加減乘除
#創建一個3行3列的二維數組x1
x1 = np.arange(9.0).reshape((3, 3))
x1
輸出:
array([[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.]])
1
2
3
4
5
6
7
#創建一個3個元素的一維數組x2
x2 = np.arange(3.0)
x2
輸出:
array([ 0., 1., 2.])
1
2
3
4
5
x1+x2

x1+x2
輸出:
array([[ 0., 2., 4.],
[ 3., 5., 7.],
[ 6., 8., 10.]])
1
2
3
4
5
x2會自動補全成

array([[ 0., 1., 2.],
[ 0., 1., 2.],
[ 0., 1., 2.]])

再和x1相加,對應的元素相加。【廣播機制】

1.2 矩陣積np.dot()
兩個集合中,a的行數和b的列數必須保持一致

 

arr1=np.array([[1,2],[3,4]])
arr1
輸出:
array([[1, 2],
[2, 3]])
1
2
3
4
5
arr2=np.array([[5,6],[7,8]])
arr2
輸出:
array([[5, 6],
[7, 8]])
1
2
3
4
5
np.dot(arr1,arr2)
輸出:
array([[19, 22],
[31, 36]])
1
2
3
4
1.3 逆矩陣
函數np.linalg.inv()
矩陣相乘:行和列相同,行乘列。

#導包
import numpy as np
from IPython.display import display
1
2
3
# 創建兩個二維數組
a = np.random.randint(0,10,size = (2,3))

b = np.random.randint(0,10,size = (3,4))
display(a,b)
1
2
3
4
5


#矩陣點乘:行乘列:8*0+4*8+4*4 = 48
np.dot(a,b)
1
2


#單元矩陣:a_T*a
unit_a = np.dot(a_T,a)
# 逆矩陣的求解:
nverse_matrix = np.linalg.inv(unit_a)
nverse_matrix
1
2
3
4
5


2、廣播機制
【重要】ndarray廣播機制的三條規則:缺失維度的數組將維度補充為進行運算的數組的維度。缺失的數組元素使用已有元素進行補充。

規則一:為缺失的維度補1(進行運算的兩個數組之間的維度只能相差一個維度)
規則二:缺失元素用已有值填充
規則三:缺失維度的數組只能有一行或者一列
例1: m = np.ones((2, 3)) a = np.arange(3) 求m+a

m=np.ones((2,3))
a=np.arange(3)
1
2
m
輸出:
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
1
2
3
4
a
輸出:
array([0, 1, 2])
1
2
3
m+a
輸出:
array([[ 1., 2., 3.],
[ 1., 2., 3.]])
1
2
3
4
七、ndarray的排序
1、快速排序
1.1 np.sort()不改變輸入
1.2 ndarray.sort()本地處理,不占用空間,但改變輸入
np.random.seed(3)
arr=np.random.randint(0,10,size=(3,4))
arr
輸出:
array([[8, 9, 3, 8],
[8, 0, 5, 3],
[9, 9, 5, 7]])
1
2
3
4
5
6
7
#默認排序,對行進行從小到大的排序,參數axis默認為-1
np.sort(arr)
輸出:
array([[3, 8, 8, 9],
[0, 3, 5, 8],
[5, 7, 9, 9]])
1
2
3
4
5
6
#np.sort(arr)不改變arr,arr和原來一樣
arr
輸出:
array([[8, 9, 3, 8],
[8, 0, 5, 3],
[9, 9, 5, 7]])
1
2
3
4
5
6
#axis=0,按列進行排序
np.sort(arr,axis=0)
輸出:
array([[8, 0, 3, 3],
[8, 9, 5, 7],
[9, 9, 5, 8]])
1
2
3
4
5
6
#按行進行排序
np.sort(arr,axis=1)
輸出:
array([[3, 8, 8, 9],
[0, 3, 5, 8],
[5, 7, 9, 9]])
1
2
3
4
5
6
arr.sort()會改變arr

#有一個參數axis,默認為-1,按行排序
arr.sort()
arr
輸出:
array([[3, 8, 8, 9],
[0, 3, 5, 8],
[5, 7, 9, 9]])
1
2
3
4
5
6
7
2、部分排序
np.partition(a,k)

有的時候我們不是對全部數據感興趣,我們可能只對最小或最大的一部分感興趣。

當k為正時,我們想要得到最小的k個數
當k為負時,我們想要得到最大的k個數
np.random.seed(3)
arr=np.random.randint(0,10,size=(3,4))
arr
輸出:
array([[8, 9, 3, 8],
[8, 0, 5, 3],
[9, 9, 5, 7]])
1
2
3
4
5
6
7
np.partition(arr,-3)
輸出:
array([[3, 8, 9, 8],
[0, 3, 5, 8],
[5, 7, 9, 9]])
---------------------
作者:微信1257309054
來源:CSDN
原文:https://blog.csdn.net/lm_is_dc/article/details/81098805
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM