python中的矩陣、多維數組----numpy


1. 引言

         最近在將一個算法由matlab轉成python,初學python,很多地方還不熟悉,總體感覺就是上手容易,實際上很優雅地用python還是蠻難的。目前為止,覺得就算法仿真研究而言,還是matlab用得特別舒服,可能是比較熟悉的緣故吧。matlab直接集成了很多算法工具箱,函數查詢、調用、變量查詢等非常方便,或許以后用久了python也會感覺很好用。與python相比,最喜歡的莫過於可以直接選中某段代碼執行了,操作方便,python也可以實現,就是感覺不是很方便。

        言歸正傳,做算法要用到很多的向量和矩陣運算操作,這些嘛在matlab里面已經很熟悉了,但用python的時候需要用一個查一個,挺煩的,所以在此稍作總結,后續使用過程中會根據使用體驗更新。

        python的矩陣運算主要依賴numpy包,scipy包以numpy為基礎,大大擴展了后者的運算能力。

2. 創建一般的多維數組 

import numpy as np
a = np.array([1,2,3], dtype=int)  # 創建1*3維數組   array([1,2,3])
type(a)  # numpy.ndarray類型
a.shape  # 維數信息(3L,)
a.dtype.name   # 'int32'
a.size   # 元素個數:3
a.itemsize  #每個元素所占用的字節數目:4


b=np.array([[1,2,3],[4,5,6]],dtype=int)  # 創建2*3維數組  array([[1,2,3],[4,5,6]])
b.shape  # 維數信息(2L,3L)
b.size   # 元素個數:6
b.itemsize   # 每個元素所占用的字節數目:4


c=np.array([[1,2,3],[4,5,6]],dtype='int16')  # 創建2*3維數組  array([[1,2,3],[4,5,6]],dtype=int16)
c.shape  # 維數信息(2L,3L)
c.size   # 元素個數:6
c.itemsize   # 每個元素所占用的字節數目:2
c.ndim  # 維數


d=np.array([[1,2,3],[4,5,6]],dtype=complex)    #  復數二維數組
d.itemsize  # 每個元素所占用的字節數目:16
d.dtype.name  # 元素類型:'complex128'

3. 創建特殊類型的多維數組 

a1 = np.zeros((3,4))    # 創建3*4全零二維數組
輸出:
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
a1.dtype.name   # 元素類型:'float64'
a1.size  # 元素個數:12
a1.itemsize  # 每個元素所占用的字節個數:8


a2 = np.ones((2,3,4), dtype=np.int16)  # 創建2*3*4全1三維數組
a2 = np.ones((2,3,4), dtype='int16')     # 創建2*3*4全1三維數組
輸出:
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]], dtype=int16)


a3 = np.empty((2,3))  # 創建2*3的未初始化二維數組
輸出:(may vary)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])


a4 = np.arange(10,30,5)   # 初始值10,結束值:30(不包含),步長:5
輸出:array([10, 15, 20, 25])
a5 = np.arange(0,2,0.3)    # 初始值0,結束值:2(不包含),步長:0.2
輸出:array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])


from numpy import pi
np.linspace(0, 2, 9)   # 初始值0,結束值:2(包含),元素個數:9
輸出:
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
x = np.linspace(0, 2*pi, 9)
輸出:
array([ 0.        ,  0.78539816,  1.57079633,  2.35619449,  3.14159265,
        3.92699082,  4.71238898,  5.49778714,  6.28318531])


a = np.arange(6)
輸出:
array([0, 1, 2, 3, 4, 5])
b = np.arange(12).reshape(4,3)
輸出:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
c = np.arange(24).reshape(2,3,4)
輸出:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]]) 

使用numpy.set_printoptions可以設置numpy變量的打印格式

在ipython環境下,使用help(numpy.set_printoptions)查詢使用幫助和示例

4. 多維數組的基本操作

加法和減法操作要求操作雙方的維數信息一致,均為M*N為數組方可正確執行操作。

a = np.arange(4)
輸出:
array([0, 1, 2, 3])
b = a**2
輸出:
array([0, 1, 4, 9])
c = 10*np.sin(a)
輸出:
 array([ 0.        ,  8.41470985,  9.09297427,  1.41120008])


n < 35
輸出:
array([ True,  True,  True,  True], dtype=bool)

A = np.array([[1,1],[0,1]])
B = np.array([[2,0],[3,4]])
C = A * B    # 元素點乘
輸出:
array([[2, 0],
       [0, 4]])
D = A.dot(B)   # 矩陣乘法
輸出:
array([[5, 4],
       [3, 4]])
E = np.dot(A,B)   # 矩陣乘法
輸出:
array([[5, 4],
       [3, 4]])

多維數組操作過程中的類型轉換

When operating with arrays of different types, the type of the resulting array corresponds to the more general or precise one (a behavior known as upcasting)

即操作不同類型的多維數組時,結果自動轉換為精度更高類型的數組,即upcasting

a = np.ones((2,3),dtype=int)      # int32
b = np.random.random((2,3))     # float64
b += a  # 正確 
a += b  # 錯誤
a = np.ones(3,dtype=np.int32)
b = np.linspace(0,pi,3)
c = a + b
d = np.exp(c*1j)
輸出:
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
       -0.54030231-0.84147098j])
d.dtype.name
輸出:
 'complex128'

多維數組的一元操作,如求和、求最小值、最大值等

a = np.random.random((2,3))
a.sum()
a.min()
a.max()


b = np.arange(12).reshape(3,4)
輸出:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
b.sum(axis=0)    # 按列求和
輸出:
array([12, 15, 18, 21])
b.sum(axis=1)    # 按行求和
輸出:
array([ 6, 22, 38])
b.cumsum(axis=0)   # 按列進行元素累加
輸出:
array([[ 0,  1,  2,  3],
       [ 4,  6,  8, 10],
       [12, 15, 18, 21]])
b.cumsum(axis=1)   # 按行進行元素累加
輸出:
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])

universal functions

B = np.arange(3)
np.exp(B)
np.sqrt(B)
C = np.array([2.,-1.,4.])
np.add(B,C)

其他的ufunc函數包括:

allanyapply_along_axisargmaxargminargsortaveragebincountceilclipconjcorrcoefcovcrosscumprodcumsumdiffdotfloor,innerlexsortmaxmaximummeanmedianminminimumnonzeroouterprodreroundsortstdsumtracetransposevar,vdotvectorizewhere

5. 數組索引、切片和迭代

 a = np.arange(10)**3
a[2]
a[2:5]
a[::-1] # 逆序輸出
for i in a:
    print (i**(1/3.))
def f(x,y):
    return 10*x+y
b = np.fromfunction(f,(5,4),dtype=int)
b[2,3]
b[0:5,1]
b[:,1]
b[1:3,:]
b[-1]
c = np.array([[[0,1,2],[10,11,12]],[[100,101,102],[110,111,112]]])
輸出:
array([[[  0,   1,   2],
        [ 10,  11,  12]],

       [[100, 101, 102],
        [110, 111, 112]]])
c.shape
輸出:
(2L, 2L, 3L)
c[0,...]
c[0,:,:]
輸出:
array([[ 0,  1,  2],
       [10, 11, 12]])
c[:,:,2]
c[...,2]
輸出:
array([[  2,  12],
       [102, 112]])

for row in c:
    print(row)

for element in c.flat:
    print(element)
a = np.floor(10*np.random.random((3,4)))
輸出:
array([[ 3.,  9.,  8.,  4.],
       [ 2.,  1.,  4.,  6.],
       [ 0.,  6.,  0.,  2.]])
a.ravel()
輸出:
array([ 3.,  9.,  8., ...,  6.,  0.,  2.])
a.reshape(6,2)
輸出:
array([[ 3.,  9.],
       [ 8.,  4.],
       [ 2.,  1.],
       [ 4.,  6.],
       [ 0.,  6.],
       [ 0.,  2.]])
a.T
輸出:
array([[ 3.,  2.,  0.],
       [ 9.,  1.,  6.],
       [ 8.,  4.,  0.],
       [ 4.,  6.,  2.]])
a.T.shape
輸出:
(4L, 3L)
a.resize((2,6))
輸出:
array([[ 3.,  9.,  8.,  4.,  2.,  1.],
       [ 4.,  6.,  0.,  6.,  0.,  2.]])
a.shape
輸出:
(2L, 6L)
a.reshape(3,-1)
輸出:
array([[ 3.,  9.,  8.,  4.],
       [ 2.,  1.,  4.,  6.],
       [ 0.,  6.,  0.,  2.]])

詳查以下函數:

ndarray.shapereshaperesizeravel

 

6. 組合不同的多維數組

a = np.floor(10*np.random.random((2,2)))
輸出:
array([[ 5.,  2.],
       [ 6.,  2.]])
b = np.floor(10*np.random.random((2,2)))
輸出:
array([[ 0.,  2.],
       [ 4.,  1.]])
np.vstack((a,b))
輸出:
array([[ 5.,  2.],
       [ 6.,  2.],
       [ 0.,  2.],
       [ 4.,  1.]])
np.hstack((a,b))
輸出:
array([[ 5.,  2.,  0.,  2.],
       [ 6.,  2.,  4.,  1.]])


from numpy import newaxis
np.column_stack((a,b))
輸出:
array([[ 5.,  2.,  0.,  2.],
       [ 6.,  2.,  4.,  1.]])


a = np.array([4.,2.])
b = np.array([2.,8.])
a[:,newaxis]
輸出:
array([[ 4.],
       [ 2.]])
b[:,newaxis]
輸出:
array([[ 2.],
       [ 8.]])
np.column_stack((a[:,newaxis],b[:,newaxis]))
輸出:
array([[ 4.,  2.],
       [ 2.,  8.]])
np.vstack((a[:,newaxis],b[:,newaxis]))
輸出:
array([[ 4.],
       [ 2.],
       [ 2.],
       [ 8.]])
np.r_[1:4,0,4]
輸出:
array([1, 2, 3, 0, 4])
np.c_[np.array([[1,2,3]]),0,0,0,np.array([[4,5,6]])]
輸出:
array([[1, 2, 3, 0, 0, 0, 4, 5, 6]])

詳細使用請查詢以下函數:

hstackvstackcolumn_stackconcatenatec_r_

7. 將較大的多維數組分割成較小的多維數組

a = np.floor(10*np.random.random((2,12)))
輸出:
array([[ 9.,  7.,  9., ...,  3.,  2.,  4.],
       [ 5.,  3.,  3., ...,  9.,  7.,  7.]])
np.hsplit(a,3)
輸出:
[array([[ 9.,  7.,  9.,  6.],
        [ 5.,  3.,  3.,  1.]]), array([[ 7.,  2.,  1.,  6.],
        [ 7.,  5.,  0.,  2.]]), array([[ 9.,  3.,  2.,  4.],
        [ 3.,  9.,  7.,  7.]])]
np.hsplit(a,(3,4))
輸出:
[array([[ 9.,  7.,  9.],
        [ 5.,  3.,  3.]]), array([[ 6.],
        [ 1.]]), array([[ 7.,  2.,  1., ...,  3.,  2.,  4.],
        [ 7.,  5.,  0., ...,  9.,  7.,  7.]])]

實現類似功能的函數包括:

hsplit,vsplit,array_split

8.  多維數組的復制操作

a = np.arange(12)
輸出:
array([ 0,  1,  2, ...,  9, 10, 11])


not copy at all

b = a
b is a    # True
b.shape = 3,4
a.shape  # (3L,4L)

def f(x)   # Python passes mutable objects as references, so function calls make no copy.
    print(id(x))   # id是python對象的唯一標識符

id(a)   # 111833936L
id(b)   # 111833936L
f(a)     # 111833936L


淺復制

c = a.view()
c is a   # False
c.base is a   # True
c.flags.owndata    # False
c.shape = 2,6
a.shape   # (3L,4L)
c[0,4] = 1234
print(a)
輸出:
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])
s = a[:,1:3]
s[:] = 10
print(a)
輸出:
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])


深復制
d = a.copy()
d is a   # False
d.base is a   # False
d[0,0] = 9999
print(a)
輸出:
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])

numpy基本函數和方法一覽

Array   Creation

arangearraycopyemptyempty_likeeyefromfilefromfunctionidentitylinspacelogspacemgridogridonesones_likerzeros,zeros_like

Conversions

ndarray.astypeatleast_1datleast_2datleast_3dmat

Manipulations

array_splitcolumn_stackconcatenatediagonaldsplitdstackhsplithstackndarray.itemnewaxisravelrepeatreshaperesize,squeezeswapaxestaketransposevsplitvstack

Questionsallanynonzerowhere

Ordering

argmaxargminargsortmaxminptpsearchsortedsort

Operations

choosecompresscumprodcumsuminnerndarray.fillimagprodputputmaskrealsum

Basic Statistics

covmeanstdvar

Basic Linear Algebra

crossdotouterlinalg.svdvdot

完整的函數和方法一覽表鏈接:

https://docs.scipy.org/doc/numpy-dev/reference/routines.html#routines

9. 特殊的索引技巧

 1 a = np.arange(12)**2
 2 輸出:
 3 array([  0,   1,   4, ...,  81, 100, 121])
 4 i = np.array([1,1,3,8,5])
 5 a[i]
 6 輸出:
 7 array([ 1,  1,  9, 64, 25])
 8 
 9 j = np.array([[3,4],[9,7]])
10 a[j]
11 輸出:
12 array([[ 9, 16],
13        [81, 49]])
14 
15 
16 palette = np.array([[0,0,0],[255,0,0],[0,255,0],[0,0,255],[255,255,255]])
17 image = np.array([[0,1,2,0],[0,3,4,0]])
18 palette[image]
19 輸出:
20 array([[[  0,   0,   0],
21         [255,   0,   0],
22         [  0, 255,   0],
23         [  0,   0,   0]],
24 
25        [[  0,   0,   0],
26         [  0,   0, 255],
27         [255, 255, 255],
28         [  0,   0,   0]]])
29 
30 
31 i = np.array([[0,1],[1,2]])
32 j = np.array([[2,1],[3,3]])
33 a[i,j]
34 輸出:
35 array([[ 2,  5],
36        [ 7, 11]])
37 l = [i,j]
38 a[l]
39 輸出:
40 array([[ 2,  5],
41        [ 7, 11]])
42 
43 
44 a[i,2]
45 輸出:
46 array([[ 2,  6],
47        [ 6, 10]])
48 
49 a[:,j]
50 輸出:
51 array([[[ 2,  1],
52         [ 3,  3]],
53 
54        [[ 6,  5],
55         [ 7,  7]],
56 
57        [[10,  9],
58         [11, 11]]])
s = np.array([i,j])
print(s)
array([[[0, 1],
        [1, 2]],

       [[2, 1],
        [3, 3]]])

a[tuple(s)]
輸出:
array([[ 2,  5],
       [ 7, 11]])
print(tupe(s))
輸出:
(array([[0, 1],
        [1, 2]]), array([[2, 1],
        [3, 3]]))

10. 尋找最大值/最小值及其對應索引值

time = np.linspace(20, 145, 5)
輸出:
 array([  20.  ,   51.25,   82.5 ,  113.75,  145.  ])

data = np.sin(np.arange(20)).reshape(5,4)
輸出:
array([[ 0.        ,  0.84147098,  0.90929743,  0.14112001],
       [-0.7568025 , -0.95892427, -0.2794155 ,  0.6569866 ],
       [ 0.98935825,  0.41211849, -0.54402111, -0.99999021],
       [-0.53657292,  0.42016704,  0.99060736,  0.65028784],
       [-0.28790332, -0.96139749, -0.75098725,  0.14987721]])

ind = data.argmax(axis=0)
輸出:
array([2, 0, 3, 1], dtype=int64)

time_max = time[ind]
輸出:
array([  82.5 ,   20.  ,  113.75,   51.25])

data_max = data[ind, xrange(data.shape[1])]
輸出:
array([ 0.98935825,  0.84147098,  0.99060736,  0.6569866 ])

np.all(data_max == data.max(axis=0))
輸出:
True



a = np.arange(5)
a[[1,3,4]] = 0
print(a)
輸出:
array([0, 0, 2, 0, 0])
a = np.arange(5)
a[[0,0,2]] = [1,2,3]
print(a)
輸出:
array([2, 1, 3, 3, 4])


a = np.arange(5)
a[[0,0,2]] += 1
print(a)
輸出:
array([1, 1, 3, 3, 4])
 a = np.arange(12).reshape(3,4)
 b = a > 4
輸出:
array([[False, False, False, False],
       [False,  True,  True,  True],
       [ True,  True,  True,  True]], dtype=bool)

a[b]
輸出:
array([ 5,  6,  7,  8,  9, 10, 11])

a[b] = 0
print(a)
輸出:
array([[0, 1, 2, 3],
       [4, 0, 0, 0],
       [0, 0, 0, 0]])
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True])
b2 = n.array([True,False,True,False])
a[b1,:]
輸出:
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

a[b1]
輸出:
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

a[:,b2]
輸出:
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])

a[b1,b2]
輸出:
array([ 4, 10])

11. ix_() function

 1 a = np.array([2,3,4,5])
 2 b = np.array([8,5,4])
 3 c = np.array([5,4,6,8,3])
 4 ax,bx,cx = np.ix_(a,b,c)
 5 print(ax)   # (4L, 1L, 1L)
 6 輸出:
 7 array([[[2]],
 8 
 9        [[3]],
10 
11        [[4]],
12 
13        [[5]]])
14 print(bx)    # (1L, 3L, 1L)
15 輸出:
16 array([[[8],
17         [5],
18         [4]]])
19 print(cx)   # (1L, 1L, 5L)
20 輸出:
21 array([[[5, 4, 6, 8, 3]]])
22 
23 
24 result = ax + bx*cx
25 輸出:
26 array([[[42, 34, 50, 66, 26],
27         [27, 22, 32, 42, 17],
28         [22, 18, 26, 34, 14]],
29 
30        [[43, 35, 51, 67, 27],
31         [28, 23, 33, 43, 18],
32         [23, 19, 27, 35, 15]],
33 
34        [[44, 36, 52, 68, 28],
35         [29, 24, 34, 44, 19],
36         [24, 20, 28, 36, 16]],
37 
38        [[45, 37, 53, 69, 29],
39         [30, 25, 35, 45, 20],
40         [25, 21, 29, 37, 17]]])
41 
42 result[3,2,4]
43 輸出:17

12. 線性代數運算

a = np.array([[1.,2.],[3.,4.]])
a.transpose()   # 轉置
np.linalg.inv(a)   # 求逆
u = np.eye(2)   # 產生單位矩陣
np.dot(a,a)    # 矩陣乘積
np.trace(a)    # 求矩陣的跡
y = np.array([5.],[7.]])
np.linalg.solve(a,y)  # 求解線性方程組
np.linalg.eig(a)   # 特征分解

“Automatic” Reshaping

 1 a = np.arange(30)
 2 a.shape = 2,-1,3
 3 a.shape   #  (2L, 5L, 3L)
 4 print(a)
 5 array([[[ 0,  1,  2],
 6         [ 3,  4,  5],
 7         [ 6,  7,  8],
 8         [ 9, 10, 11],
 9         [12, 13, 14]],
10 
11        [[15, 16, 17],
12         [18, 19, 20],
13         [21, 22, 23],
14         [24, 25, 26],
15         [27, 28, 29]]])
1 x = np.arange(0,10,2)
2 y = np.arange(5)
3 m = np.vstack([x,y])
4 輸出:
5 array([[0, 2, 4, 6, 8],
6        [0, 1, 2, 3, 4]])
7 n = np.hstack([x,y])
8 輸出:
9 array([0, 2, 4, 6, 8, 0, 1, 2, 3, 4])

13. 矩陣的創建

 a = np.array([1,2,3])
a1 = np.mat(a)
輸出:
matrix([[1, 2, 3]])
type(a1)
輸出:
numpy.matrixlib.defmatrix.matrix
a1.shape
輸出:
(1L, 3L)
a.shape
輸出:
(3L,)


b=np.matrix([1,2,3])
輸出:
matrix([[1, 2, 3]])



from numpy import *
data1 = mat(zeros((3,3)))
data2 = mat(ones((2,4)))
data3 = mat(random.rand(2,2))
data4 = mat(random.randint(2,8,size=(2,5)))
data5 = mat(eye(2,2,dtype=int))

14. 常見的矩陣運算

 1 a1 = mat([1,2])
 2 a2 = mat([[1],[2]])
 3 a3 = a1 * a2
 4 print(a3)
 5 輸出:
 6 matrix([[5]])
 7 
 8 print(a1*2)
 9 輸出:
10 matrix([[2, 4]])
11 
12 a1 = mat(eye(2,2)*0.5)
13 print(a1.I)
14 輸出:
15 matrix([[ 2.,  0.],
16         [ 0.,  2.]])
17 
18 
19 a1 = mat([[1,2],[2,3],[4,2]])
20 a1.sum(axis=0)
21 輸出:
22 matrix([[7, 7]])
23 a1.sum(axis=1)
24 輸出:
25 matrix([[3],
26         [5],
27         [6]])
28 a1.max()  # 求矩陣元素最大值
29 輸出:
30 4
31 a1.min()  # 求矩陣元素最小值
32 輸出:
33 1
34 
35 np.max(a1,0)  # 求矩陣每列元素最大值
36 輸出:
37 matrix([[4, 3]])
38 np.max(a1,1)  # 求矩陣每行元素最大值
39 輸出:
40 matrix([[2],
41         [3],
42         [4]])
43 
44 
45 a = mat(ones((2,2)))
46 b = mat(eye((2)))
47 c = hstack((a,b))
48 輸出:
49 matrix([[ 1.,  1.,  1.,  0.],
50         [ 1.,  1.,  0.,  1.]])
51 d = vstack((a,b))
52 輸出:
53 matrix([[ 1.,  1.],
54         [ 1.,  1.],
55         [ 1.,  0.],
56         [ 0.,  1.]])

15. 矩陣、數組、列表之間的互相轉換

 1 aa = [[1,2],[3,4],[5,6]]
 2 bb = array(aa)
 3 cc = mat(bb)
 4 
 5 cc.getA()  # 矩陣轉換為數組
 6 cc.tolist()  # 矩陣轉換為列表
 7 bb.tolist() # 數組轉換為列表
 8 
 9 
10 # 當列表為一維時,情況有點特殊
11 aa = [1,2,3,4]
12 bb = array(aa)
13 輸出:
14 array([1, 2, 3, 4])
15 cc = mat(bb)
16 輸出:
17 matrix([[1, 2, 3, 4]])
18 
19 cc.tolist()
20 輸出:
21 [[1, 2, 3, 4]]
22 
23 bb.tolist()
24 輸出:
25 [1, 2, 3, 4]
26 
27 cc.tolist()[0]
28 輸出:
29 [1, 2, 3, 4]

 

內容整理參考鏈接如下:

https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

http://python.usyiyi.cn/translate/NumPy_v111/reference/arrays.scalars.html#arrays-scalars-built-in


免責聲明!

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



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