numpy常用方法

1.multiply

对应位置元素相乘。

import numpy as np
x1 = [1, 2, 3]
x2 = [4, 5, 6]

np.multiply(x1, x2)
array([ 4, 10, 18])

2.std 标准方差 ,var 方差

b = [1, 3, 5, 6]
np.var(b)
3.6875
np.std(b)
1.920286436967152
np.power(np.std(b), 2)
3.6874999999999996
c = [[1, 2, 3, 4, 5, 6],
    [3, 4, 5, 6, 7, 8]]
np.var(c[0]) # 全部元素求方差
2.9166666666666665
np.var(c, 0) # 按列求方差
array([1., 1., 1., 1., 1., 1.])
np.var(c, 1) # 按行求方差
array([2.91666667, 2.91666667])

3.mean

x = [1, 3, 5, 6]
np.mean(x)
3.75
np.mean(c) #全部元素求均值
4.5
np.mean(c, 0) # 按列求均值
array([2., 3., 4., 5., 6., 7.])
np.mean(c, 1) # 按行求均值
array([3.5, 5.5])

4.sum

求向量的和。也可以求矩阵所有元素的和

x = [[0, 1, 2],
    [2, 1, 0]]

b = [1, 3, 5, 6]
np.sum(x)
6
np.sum(b)
15

5.cov() (样本协方差 )

https://zh.wikipedia.org/wiki/协方差矩阵

b = [1, 3, 5, 6]
np.cov(b)
array(4.91666667)
np.sum(
    
    (np.multiply(b, b)) - np.mean(b) * np.mean(b)

)/3
4.916666666666667
x = [[0, 1, 2],
    [2, 1, 0]]
np.cov(x)
array([[ 1., -1.],
       [-1.,  1.]])
np.sum(
    (np.multiply(x[0],x[1])) - np.mean(x[0])*np.mean(x[1])
)/2
-1.0

6.corrcoef

该函数得到相关系数矩阵。

vc = [1, 2, 39, 0, 8]
vb = [1, 2, 38, 0, 8]

np.mean(np.multiply((vc - np.mean(vc)),(vb - np.mean(vb))))/( np.std(vb) * np.std(vc) )
0.999986231330961
#corrcoef得到相关系数矩阵(向量的相似程度)
np.corrcoef(vc,vb)
array([[1.        , 0.99998623],
       [0.99998623, 1.        ]])

相关系数公式:

7.vdot 向量的点积 ,对应位置相乘求和

l1 = [1, 2, 3]
l2 = [4, 5, 6]
np.vdot(l1, l2)
32

8.mat,列表转换成矩阵形式。这在矩阵运算中不可缺少。

l1 = [1, 2, 3]
l2 = [4, 5, 6]

ll = [l1, l2]
np.vdot(l1, l2)
32
np.mat(l1) * np.mat(l2).T
matrix([[32]])
np.mat(ll)
matrix([[1, 2, 3],
        [4, 5, 6]])

9.shape,返回矩阵的行列数

#矩阵有一个shape属性,是一个(行,列)形式的元组
a = np.array([[1,2,3],[4,5,6]])
a.shape
(2, 3)

10.ones ,返回指定行列数的全一矩阵

# 返回按要求的矩阵
ones = np.ones((3, 3))
ones
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

11.xrange

for i in range(3):
    print(i)

test = [1, 2, 3, 4]
print(test[:])
0
1
2
[1, 2, 3, 4]
print(test[2:3])
[3]
for i in range(2, 5):
    print(i)
2
3
4

test[:]则表示获取test列表中的所有元素。

test[2:3]则表示获取从第2个位置到第三个位置间的元素。

12.strptime

import time

from datetime import datetime, date

dd = datetime.strptime('2014-04-03T10:53:49.8752', '%Y-%m-%dT%H:%M:%S.%f')
print(time.mktime(dd.timetuple()))
1396493629.0

strptime把时间按照指定的格式转换。处理时间的时候会用到这个函数。

13.tuple和数组转换成字符串

tuple = (1, 2, 3)
print(tuple[len(tuple) - 1])
3
tuple[-1]
3

14.transpose和.T

aa = [[1], [2], [3]]
aa = np.mat(aa)
aa
matrix([[1],
        [2],
        [3]])
aa.transpose()
matrix([[1, 2, 3]])
aa
matrix([[1],
        [2],
        [3]])
aa.T
matrix([[1, 2, 3]])
aa
matrix([[1],
        [2],
        [3]])

15.zeros() ones()

np.zeros((3, 3))
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
np.ones((3, 3))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

16.列表 数组 linspace

li = [1, 2, 3, 4]
print(li)
[1, 2, 3, 4]
arr = np.array(li)
arr
array([1, 2, 3, 4])
np.linspace(0, 3, 6)
array([0. , 0.6, 1.2, 1.8, 2.4, 3. ])

数组中间元素没有分隔符。列表逗号分割。

linspace返回的是指定的开始结束位置的指定个数的数。

17.argsort 排序索引

#数组的构建问题,初始化使用array()
arr = np.array(np.zeros(4))
arr
array([0., 0., 0., 0.])
arr[0] = 0.1
arr[1] = 0.6
arr[2] = 0.5
arr[3] = 0.7
#有-号,降序排列
#无-号,升序排列
sortindex = np.argsort(arr)
for id in sortindex:
    print('索引:', id)

for i in arr:
    print(i)
索引: 0
索引: 2
索引: 1
索引: 3
0.1
0.6
0.5
0.7

argsort函数返回数组按照从小到大排序的位置的索引。

sortindex = np.argsort(-arr) 
for id in sortindex:
    print('索引:', id )
for i in sortindex:
    print(arr[i])
索引: 3
索引: 1
索引: 2
索引: 0
0.7
0.6
0.5
0.1

18. [:,:]矩阵元素切片

# 获取矩阵元素
li = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]]

# 获取第二行第0个元素
np.mat(li)[2, 0]
7
#第一个冒号代表获取行的起止行号
#第二个冒号代表获取列的起止行号
np.mat(li)[:,:]
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])

19.diag , 构建对角矩阵

# 构建对角阵
# diag()参数为列表即可
dd = [1, 2, 3]
diaggg = np.diag(dd)
print('diag:', diaggg)
diag: [[1 0 0]
 [0 2 0]
 [0 0 3]]
dd = [1, 2, 3]
diaggg = np.diag(dd)

print('diag:', diaggg)
diag: [[1 0 0]
 [0 2 0]
 [0 0 3]]

20.linalg.inv和.I 求逆矩阵

dd = [1, 2, 3]
diaggg = np.diag(dd)
diaggg
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])
np.linalg.inv(diaggg)
array([[1.        , 0.        , 0.        ],
       [0.        , 0.5       , 0.        ],
       [0.        , 0.        , 0.33333333]])
np.mat(diaggg).I
matrix([[1.        , 0.        , 0.        ],
        [0.        , 0.5       , 0.        ],
        [0.        , 0.        , 0.33333333]])
# 求逆矩阵
li = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
lv = np.linalg.inv(np.mat(li))
lv
matrix([[ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15],
        [-6.30503948e+15,  1.26100790e+16, -6.30503948e+15],
        [ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15]])
# 求逆矩阵
np.mat(li).I
matrix([[ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15],
        [-6.30503948e+15,  1.26100790e+16, -6.30503948e+15],
        [ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15]])

上面求逆矩阵有两种方式。 linalg.inv()和 矩阵.I 。两种方式均可。

21.dot矩阵点积

li = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

ld = np.dot(li, li)
ld
array([[ 30,  36,  42],
       [ 66,  81,  96],
       [102, 126, 150]])

22.eye 单元矩阵

np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

23. eig 矩阵的特征值和特征向量

A = np.mat([
    [1,0,0,0,2],
    [0,0,3,0,0],
    [0,0,0,0,0],
    [0,4,0,0,0]
])
U = A * A.T
lamb, hU = np.linalg.eig(U)

print(hU)
print(''.center(20,'-'))
print(lamb)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
--------------------
[ 5.  9.  0. 16.]

24 .sorted 排序

li = [8, 0, 3, 6, 1, 0, 5, 3, 8, 9]
sorted(li, reverse = True)  # 降序
[9, 8, 8, 6, 5, 3, 3, 1, 0, 0]
sorted(li, reverse = False) # 升序
[0, 0, 1, 3, 3, 5, 6, 8, 8, 9]

25.linalg.svd 奇异值分解

A = np.mat([
    [1,0,0,0,2],
    [0,0,3,0,0],
    [0,0,0,0,0],
    [0,4,0,0,0]
])

U, S, VT = np.linalg.svd(A)
U
matrix([[ 0.,  0.,  1.,  0.],
        [ 0.,  1.,  0.,  0.],
        [ 0.,  0.,  0., -1.],
        [ 1.,  0.,  0.,  0.]])
S
array([4.        , 3.        , 2.23606798, 0.        ])
VT
matrix([[-0.        ,  1.        ,  0.        ,  0.        ,  0.        ],
        [-0.        ,  0.        ,  1.        ,  0.        ,  0.        ],
        [ 0.4472136 ,  0.        ,  0.        ,  0.        ,  0.89442719],
        [ 0.        ,  0.        ,  0.        ,  1.        ,  0.        ],
        [-0.89442719,  0.        ,  0.        ,  0.        ,  0.4472136 ]])
U * (np.mat(np.diag(S)) * np.eye(4, 5)) * VT
matrix([[1., 0., 0., 0., 2.],
        [0., 0., 3., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 4., 0., 0., 0.]])

26.random.rand

A = np.mat([
    [1,0,0,0,2],
    [0,0,3,0,0],
    [0,0,0,0,0],
    [0,4,0,0,0]])
A[:, 1]
matrix([[0],
        [0],
        [0],
        [4]])
# 获取3*3个0-1之间的数字
rr = np.random.rand(3, 3)
rr
array([[0.64614279, 0.77799642, 0.5023505 ],
       [0.63227228, 0.84713943, 0.5859797 ],
       [0.97261844, 0.17905887, 0.930699  ]])
rr - 0.5
array([[ 0.14614279,  0.27799642,  0.0023505 ],
       [ 0.13227228,  0.34713943,  0.0859797 ],
       [ 0.47261844, -0.32094113,  0.430699  ]])
2 * (rr - 0.5)
array([[ 0.29228559,  0.55599284,  0.00470101],
       [ 0.26454456,  0.69427886,  0.1719594 ],
       [ 0.94523687, -0.64188226,  0.86139799]])

27.arange

# arange获取指定起始位置,指定步长的一系列数。
delta = 0.25
x = np.arange(-3.0, 3.0, delta)
x
array([-3.  , -2.75, -2.5 , -2.25, -2.  , -1.75, -1.5 , -1.25, -1.  ,
       -0.75, -0.5 , -0.25,  0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,
        1.5 ,  1.75,  2.  ,  2.25,  2.5 ,  2.75])

28.nonzero()

nonzero()函数返回矩阵中非0元素的位置

nz的返回值意义如下:

第一行是所有非零数所在行值

第二行是所有非零值所在列值

x = [[1, 0, 0, 0, 2],
    [0, 0, 3, 0, 0]]
print(x)
[[1, 0, 0, 0, 2], [0, 0, 3, 0, 0]]
nz = np.nonzero(x)
print(nz)
(array([0, 0, 1], dtype=int64), array([0, 4, 2], dtype=int64))

非零元素x[0,0], x[0, 4], x[1, 2]得到上述结果

print(x[0][0], x[0][4], x[1][2])
1 2 3
print(nz[0])
[0 0 1]

29.获取指定位置的元素

A = np.mat([
    [1,0,0,0,2],
    [0,0,3,0,0],
    [0,0,0,0,0],
    [0,4,0,0,0]])

sample = A[0, :] # 获取第0行的所有元素 
sample
matrix([[1, 0, 0, 0, 2]])
sample[0]
matrix([[1, 0, 0, 0, 2]])
sample = A[:, 2] # 获取第3列的所有元素
sample
matrix([[0],
        [3],
        [0],
        [0]])

第二个例子:

A = np.mat([
    [1,0,0,0,2],
    [0,0,3,0,0],
    [0,0,0,0,0],
    [0,4,0,0,0]])
# 根据ind序列索引获取矩阵A中的数据
ind = [2, 1, 3, 0]
print(A[ind, 0])
[[0]
 [0]
 [0]
 [1]]

30.zip

[1, 2, 3] + [4 , 5, 6]
[1, 2, 3, 4, 5, 6]
np.array([1, 2, 3]) + np.array([4, 5, 6])
array([5, 7, 9])

注意二者区别

li = [1, 2, 3, 4, 5, 6]
# 可以互换指定区域的位置
print(li[3:6] + li[0:3])
[4, 5, 6, 1, 2, 3]
# 成对获取x,y的值
l1 = [1, 2, 3]
l2 = [4, 5, 6]
for x, y in zip(l1, l2):
    print(x, y)
1 4
2 5
3 6

31.chr函数,获取指定的字符

for i in range(65, 70):
    print(str(chr(i)))
A
B
C
D
E
li = ['a', 'b', 'c', 'd', 'e']
for i in li:
    print(ord(i))
97
98
99
100
101
def chrs(strings):
    list = []
    for i in range(len(strings)):
        list.append(ord(strings[i]))
    return list

msg = chrs('情人节快乐')
print(msg)
[24773, 20154, 33410, 24555, 20048]
def chrs(num_list):
    string = ''
    for i in num_list:
        string += chr(i)
    return string

msg = chrs([24773, 20154, 33410, 24555, 20048])
print(msg)
情人节快乐

32.random.shuffle

shuffle函数随机打乱列表中的元素顺序

li = [0, 1, 2, 3, 4, 5, 6, 7, 8] # 返回列表
li
[0, 1, 2, 3, 4, 5, 6, 7, 8]
#shuffle函数随机打乱列表中的元素顺序
np.random.shuffle(li)
li
[3, 6, 7, 0, 1, 5, 4, 8, 2]

33.vdot 点积

# 返回两向量的点积
l1 = [1, 2, 3]
l2 = [4, 5, 6]
li = [l1, l2]
np.vdot(l1, l2)
32
np.dot(l1, l2)
32
np.mat(l1) * np.mat(l2).T
matrix([[32]])
np.mat(li)
matrix([[1, 2, 3],
        [4, 5, 6]])

vdot 和 dot都可以获取向量的点积。

区别:

li = [
    [1, 2, 3],
    [4, 5, 6],
    [1, 2, 3]
]

np.dot(np.mat(li), np.mat(li).T)
matrix([[14, 32, 14],
        [32, 77, 32],
        [14, 32, 14]])
li = [
    [1, 2, 3],
    [4, 5, 6],
    [1, 2, 3]
]
print(np.mat(li))
print(np.vdot(np.mat(li), np.mat(li)))
[[1 2 3]
 [4 5 6]
 [1 2 3]]
[[1]]

34.次方计算**

print( 3*2**2)
print( 3*2**0.5)
print( (3*2)**2)
print ((3*2)**0.5)
12
4.242640687119286
36
2.449489742783178

可见 **次方计算优先级要高!

35.max函数

ll=[3,4,6,2,89,9,3,2]
print(max(ll))
l2=[[3,4,6,2,89,9,3,2],[3,6,7,8,983,3,5,6]]
print(max(l2[0]))
print(max(l2))
89
89
[3, 6, 7, 8, 983, 3, 5, 6]

36.mgrid函数

# 开始值,结束值,步长。如果步长为虚数,表示产生的个数长度
print(np.mgrid[-5:5:3j])
[-5.  0.  5.]
print(np.mgrid[-5:5:3])
[-5 -2  1  4]
print(np.mgrid[-5:5:3j, -5:5:3j])
[[[-5. -5. -5.]
  [ 0.  0.  0.]
  [ 5.  5.  5.]]

 [[-5.  0.  5.]
  [-5.  0.  5.]
  [-5.  0.  5.]]]
print(np.mgrid[-5:5:3,-5:5:3])
[[[-5 -5 -5 -5]
  [-2 -2 -2 -2]
  [ 1  1  1  1]
  [ 4  4  4  4]]

 [[-5 -2  1  4]
  [-5 -2  1  4]
  [-5 -2  1  4]
  [-5 -2  1  4]]]

mgrid函数说明:开始值,结束值,步长。

如果步长为虚数,表示产生的个数长度。对照结果即可知道函数的功能。

37.ogrid函数

np.ogrid[-5:5:3j]
array([-5.,  0.,  5.])
np.ogrid[-5:5:3]
array([-5, -2,  1,  4])
np.ogrid[-5:5:3j,-5:5:3j]
[array([[-5.],
        [ 0.],
        [ 5.]]), array([[-5.,  0.,  5.]])]
np.ogrid[-5:5:3,-5:5:3]
[array([[-5],
        [-2],
        [ 1],
        [ 4]]), array([[-5, -2,  1,  4]])]

ogrid跟mgrid一样。不同的是,一个数矩阵,一个数组形式。第三个擦数如果是实数,说明是步长。如果是虚数,说明是个数。

ogrid[-5:5:3,-5:5:3]第一部分产生多行一列,第二部分产生一行多列。这与mgrid不同。

38.random函数

np.random.seed(1)
#要每次产生随机数相同就要设置种子,
# 相同种子数的Random对象,
# 相同次数生成的随机数字是完全相同的
np.random.uniform(-1, 1, 5)
# 用于生成一个指定范围内的随机符点数
array([-0.16595599,  0.44064899, -0.99977125, -0.39533485, -0.70648822])
np.random.random()
0.0923385947687978
np.random.random(5)
array([0.18626021, 0.34556073, 0.39676747, 0.53881673, 0.41919451])
np.random.rand(2, 3) #2行3列
array([[0.6852195 , 0.20445225, 0.87811744],
       [0.02738759, 0.67046751, 0.4173048 ]])
# 用于生成一个指定范围内的整数。
# 其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
np.random.randint(5, 10)
6
np.random.randint(5, 10, size = (5, 5))
array([[6, 5, 6, 6, 6],
       [6, 5, 9, 6, 5],
       [5, 8, 7, 6, 5],
       [8, 6, 6, 8, 9],
       [5, 6, 8, 9, 7]])

39.tofile、fromfile

a = np.arange(0, 12)
a.shape = 3, 4
a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a.tofile('./data/a.bin')
b = np.fromfile('./data/a.bin', dtype = float) # 按照float类型读入数据
b
array([2.12199579e-314, 6.36598737e-314, 1.06099790e-313, 1.48539705e-313,
       1.90979621e-313, 2.33419537e-313])

数据不对,查看a的数据类型

a.dtype
dtype('int32')
b = np.fromfile('./data/a.bin', dtype = int) # 按照float类型读入数据
b
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
b.shape = 3, 4
b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

使用数组的方法函数tofile可以方便地将数组中数据以二进制的格式写进文件。

tofile输出的数据没有格式,因此用numpy.fromfile读回来的时候需要自己格式化数据。

Note:

  1. 读入的时候设置正确的dtype和shape才能保证数据一致。

并且tofile函数不管数组的排列顺序是C语言格式的还是Fortran语言格式的,统一使用C语言格式输出。

  1. sep关键字参数:
    此外如果fromfile和tofile函数调用时指定了sep关键字参数的话,数组将以文本格式输入输出。

{这样就可以通过notepad++打开查看, 不过数据是一行显示,不便于查看}

user_item_mat.tofile(user_item_mat_filename, sep=’’)

40.numpy.load和numpy.save

a = np.arange(0, 12)
a.shape = 3, 4
a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
np.save('./data/a.npy', a)
c = np.load('./data/a.npy')
c
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

numpy.load和numpy.save函数(推荐在不需要查看保存数据的情况下使用)

以NumPy专用的二进制类型保存数据,这两个函数会自动处理元素类型和shape等信息, 使用它们读写数组就方便多了,但是numpy.save输出的文件很难和其它语言编写的程序读入。

Note:

  1. 文件要保存为.npy文件类型,否则会出错

  2. 保存为numpy专用二进制格式后,就不能用notepad++打开(乱码)看了,这是相对tofile内建函数不好的一点

numpy.savez函数

如果你想将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容:

如果你用解压软件打开result.npz文件的话,会发现其中有三个文件:arr_0.npy, arr_1.npy, sin_array.npy,其中分别保存着数组a, b, c的内容。

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.arange(0, 1.0, 0.1)

c = np.sin(b)
np.savez("./data/result.npz", a, b, sin_array = c)
r = np.load("./data/result.npz")
r["arr_0"]
array([[1, 2, 3],
       [4, 5, 6]])
r["arr_1"]
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
r["sin_array"]
array([0.        , 0.09983342, 0.19866933, 0.29552021, 0.38941834,
       0.47942554, 0.56464247, 0.64421769, 0.71735609, 0.78332691])

numpy.savetxt和numpy.loadtxt(推荐需要查看保存数据时使用)

Note:savetxt缺省按照’%.18e’格式保存数据, 可以修改保存格式为‘%.8f’(小数点后保留8位的浮点数), ’%d’(整数)等等

总结:

载入txt文件:numpy.loadtxt()/numpy.savetxt()

智能导入文本/csv文件:numpy.genfromtxt()/numpy.recfromcsv()

高速,有效率但numpy特有的二进制格式:numpy.save()/numpy.load()

41.permutation函数

 #混淆位置。如果是多维数组,则混淆一维的。例如下面的arr.
np.random.permutation(10)
array([2, 3, 0, 4, 8, 1, 9, 6, 5, 7])
np.random.permutation([1, 4, 9, 12, 15])
array([12, 15,  1,  4,  9])
arr = np.arange(9).reshape((3, 3))
arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
np.random.permutation(arr)
array([[3, 4, 5],
       [6, 7, 8],
       [0, 1, 2]])

42.complex构造复数

np.complex(3, 100)
(3+100j)

43.norm求范数

from scipy.linalg.misc import norm
norm([8, 6, 10])
14.142135623730951

默认情况下,求二范数。也就是各个元素的平方和再开平方。

当然,也可以求取其他范数。例如p范数、无穷范数等。

我这里import写的是scipy。其实numpy里面也有这个函数。详细的其他范数的求法请参考官网

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.norm.html

内容的介绍。

参考资料:
https://blog.csdn.net/u010156024/article/details/50419338

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值