numpy操作小结

numpy基础

import numpy as np
nparr = np.array([i for i in range(5)])
nparr.dtype
dtype('int32')
nparr[4] = 1. 
nparr.dtype
dtype('int32')
nparr2 = np.array([1, 2, 3.0])
nparr2.dtype
dtype('float64')

numpy 创建

base
nparr = np.array([i for i in range(10)])
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
zeros
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros(10,dtype=int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.zeros(shape=(2,4),dtype=int)
array([[0, 0, 0, 0],
       [0, 0, 0, 0]])
ones
np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones(shape=(2,3))
array([[1., 1., 1.],
       [1., 1., 1.]])
full
np.full(shape=(3,5),fill_value=666)
array([[666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666]])
arange
np.arange(0,4,0.2)
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4,
       2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8])
[i for i in np.arange(0, 1, 0.2)]
[0.0, 0.2, 0.4, 0.6000000000000001, 0.8]
linespace
np.linspace(0,20,11)
array([ 0.,  2.,  4.,  6.,  8., 10., 12., 14., 16., 18., 20.])
np.linspace(0, 20, 10)
array([ 0.        ,  2.22222222,  4.44444444,  6.66666667,  8.88888889,
       11.11111111, 13.33333333, 15.55555556, 17.77777778, 20.        ])
random
# 产生一个随机数
np.random.random()
0.30175138248960554
# 产生一个shaoe的随机数组
np.random.random((3,5))
array([[0.45925724, 0.93660836, 0.77624171, 0.91976887, 0.16110875],
       [0.17279011, 0.05058195, 0.46714559, 0.65925252, 0.56058558],
       [0.59439629, 0.04804467, 0.14607784, 0.56502283, 0.66715391]])
# 产生一个按照正态分布随机数组
np.random.normal(size=(3,4))
array([[ 0.69446794,  0.96441901,  0.68527894,  2.57151514],
       [ 0.43940671, -0.76200213,  0.43444882,  0.89212366],
       [ 0.6425957 , -1.99443125,  0.63850483,  0.08472212]])
# 产生一个均值为0方差为1的正态分布
np.random.normal(0,1,size=(3,4))
array([[ 0.89365562,  1.21913638, -0.29682463, -0.39755723],
       [-0.80627872,  0.26746836,  0.06353853, -0.10568317],
       [-0.03705902, -0.19471723,  0.48376378,  0.87488668]])

使用np.random.normal?查看random的更多用法或者用help(np.random)

# np.random?
help(np.random)

numpy.array的基本操作

np.random.seed(666)
arr = np.random.normal(0,1,size=15)
arr = arr.reshape(3,5)
arr
array([[ 0.82418808,  0.479966  ,  1.17346801,  0.90904807, -0.57172145],
       [-0.10949727,  0.01902826, -0.94376106,  0.64057315, -0.78644317],
       [ 0.60886999, -0.93101185,  0.97822225, -0.73691806, -0.29873262]])
arr.ndim # ndim表示数组的维度
2
arr.shape
(3, 5)
arr.size
15

numpy 数据访问

arr
array([[ 0.82418808,  0.479966  ,  1.17346801,  0.90904807, -0.57172145],
       [-0.10949727,  0.01902826, -0.94376106,  0.64057315, -0.78644317],
       [ 0.60886999, -0.93101185,  0.97822225, -0.73691806, -0.29873262]])
arr[0]
array([ 0.82418808,  0.479966  ,  1.17346801,  0.90904807, -0.57172145])
arr[-1]
array([ 0.60886999, -0.93101185,  0.97822225, -0.73691806, -0.29873262])

如何访问一个元素

arr[0][0]
0.8241880833175302
arr[0,0] # 建议
0.8241880833175302

如何访问多个元素

arr[1,:2] # 访问第一行的前两个元素
array([-0.10949727,  0.01902826])
arr[1,:2:1]
array([-0.10949727,  0.01902826])

numpy的subarray

sub = arr[:2]
sub[0,0]=1
sub
array([[ 1.        ,  0.479966  ,  1.17346801,  0.90904807, -0.57172145],
       [-0.10949727,  0.01902826, -0.94376106,  0.64057315, -0.78644317]])
arr
array([[ 1.        ,  0.479966  ,  1.17346801,  0.90904807, -0.57172145],
       [-0.10949727,  0.01902826, -0.94376106,  0.64057315, -0.78644317],
       [ 0.60886999, -0.93101185,  0.97822225, -0.73691806, -0.29873262]])

我们可以看到修改了sub的元素后原本的arr数组也发生了改变,所以我们如何获得sub数组呢?正确的做法是使用copy()

arr[0,0] =  0.82418808
sub = arr[:2].copy()
sub[0,0]= 1
sub
array([[ 1.        ,  0.479966  ,  1.17346801,  0.90904807, -0.57172145],
       [-0.10949727,  0.01902826, -0.94376106,  0.64057315, -0.78644317]])
arr
array([[ 0.82418808,  0.479966  ,  1.17346801,  0.90904807, -0.57172145],
       [-0.10949727,  0.01902826, -0.94376106,  0.64057315, -0.78644317],
       [ 0.60886999, -0.93101185,  0.97822225, -0.73691806, -0.29873262]])

numpy的合并

x = np.array([1,2,3])
y = np.array([3,2,1])
np.concatenate((x,y)) # 默认按照axis=0,按照行的顺序进行扩展
array([1, 2, 3, 3, 2, 1])
z = np.array([666, 666, 666])
np.concatenate([x, y, z],axis=0)
array([  1,   2,   3,   3,   2,   1, 666, 666, 666])
A = np.array([[1, 2, 3],
              [4, 5, 6]])
np.concatenate([A, A],axis=1)
array([[1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6]])
np.sum(A,axis=1) # axis =1 表示按照行从小到大进行
# axis =0 表示按照列从小达到大
A.shape
# 会得到一个元祖第一个元素表从列的方向上从小到大统计行的数目,axis= 0;第二个元素表示从行的方向上对列从小到大进行排序
(2, 3)
np.vstack([A,z]) #表示axis =0
array([[  1,   2,   3],
       [  4,   5,   6],
       [666, 666, 666]])
np.hstack([x,y])
array([1, 2, 3, 3, 2, 1])

numpy分割

x = np.arange(10)
x    
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1,x2,x3 = np.split(x,[3,7]) # split传入一个列表表示分割的下标
x1,x2,x3
(array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9]))
A = np.arange(16).reshape((4, 4))
A
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
A1,A2 = np.split(A,[2],axis=0)  # 等价于 np.vsplit(A, [2])
A1
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
A1,A2 = np.split(A,[2],axis=1)  #等价于 np.hsplit(A, [2])
A1
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])

numpy的运算

n = 10
L = np.array([i for i in range(1,10)])

2*L
array([ 2,  4,  6,  8, 10, 12, 14, 16, 18])
L-1
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
L/2
array([0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
L+2
array([ 3,  4,  5,  6,  7,  8,  9, 10, 11])
L**2
array([ 1,  4,  9, 16, 25, 36, 49, 64, 81], dtype=int32)
L//2
array([0, 1, 1, 2, 2, 3, 3, 4, 4], dtype=int32)
1/L
array([1.        , 0.5       , 0.33333333, 0.25      , 0.2       ,
       0.16666667, 0.14285714, 0.125     , 0.11111111])

np常见的内置函数

np.abs(L)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sin(L)
array([ 0.84147098,  0.90929743,  0.14112001, -0.7568025 , -0.95892427,
       -0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849])
np.cos(L)
array([ 0.54030231, -0.41614684, -0.9899925 , -0.65364362,  0.28366219,
        0.96017029,  0.75390225, -0.14550003, -0.91113026])
np.tan(L)
array([ 1.55740772, -2.18503986, -0.14254654,  1.15782128, -3.38051501,
       -0.29100619,  0.87144798, -6.79971146, -0.45231566])
np.arctan(L)
array([0.78539816, 1.10714872, 1.24904577, 1.32581766, 1.37340077,
       1.40564765, 1.42889927, 1.44644133, 1.46013911])
np.exp(L)
array([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])
np.exp2(L)
array([  2.,   4.,   8.,  16.,  32.,  64., 128., 256., 512.])
np.log(L)
array([0.        , 0.69314718, 1.09861229, 1.38629436, 1.60943791,
       1.79175947, 1.94591015, 2.07944154, 2.19722458])
np.log2(L)
array([0.        , 1.        , 1.5849625 , 2.        , 2.32192809,
       2.5849625 , 2.80735492, 3.        , 3.169925  ])
np.log10(L)
array([0.        , 0.30103   , 0.47712125, 0.60205999, 0.69897   ,
       0.77815125, 0.84509804, 0.90308999, 0.95424251])

举证运算

A = np.arange(4).reshape(2,2)
A
array([[0, 1],
       [2, 3]])
B  = np.full((2,2),4)
B 
array([[4, 4],
       [4, 4]])
A +B 
array([[4, 5],
       [6, 7]])
A-B
array([[-4, -3],
       [-2, -1]])
A*B
array([[ 0,  4],
       [ 8, 12]])
A/B
array([[0.  , 0.25],
       [0.5 , 0.75]])
A.dot(B) # 点乘
array([[ 4,  4],
       [20, 20]])
A.T # 装置矩阵
array([[0, 2],
       [1, 3]])

向量与矩阵的运算

v=  np.array([1,2])
v
array([1, 2])
A+v
array([[1, 3],
       [3, 5]])
np.vstack([v] * A.shape[0])
array([[1, 2],
       [1, 2]])

乘法

v.dot(A) # 点乘
array([4, 7])
A.dot(v)
array([2, 8])

矩阵的逆

invA = np.linalg.inv(A)
invA
array([[-1.5,  0.5],
       [ 1. ,  0. ]])
A.dot(invA)
array([[1., 0.],
       [0., 1.]])
invA.dot(A)
array([[1., 0.],
       [0., 1.]])

numpy聚合操作

import numpy as np
L = np.arange(10,20).reshape(2,5)
L 
array([[10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

sum

np.sum(L,axis=0)
array([25, 27, 29, 31, 33])

min

np.min(L,axis=0)
array([10, 11, 12, 13, 14])

max

np.max(L,axis=0)
array([15, 16, 17, 18, 19])

其他聚合操作

np.prod(L,axis=0)  # 对数组进行累乘
array([150, 176, 204, 234, 266])
np.mean(L,axis=0)  # 求平均数
array([12.5, 13.5, 14.5, 15.5, 16.5])
np.median(L,axis=0) # 中位数
array([12.5, 13.5, 14.5, 15.5, 16.5])
np.percentile(L, q=50) # 求的是百分位 q表示的是quary
14.5
np.std(L)  # 求标准差
2.8722813232690143
np.var(L)  # 求方差
8.25

arg下标操作

import numpy as np
x = np.random.normal(0, 1, 1000000)
np.argmin(x)  # 求数组中最小值的下标
971877
x[971877],np.min(x)
(-4.769787080001609, -4.769787080001609)
np.argmax(x)
717652
x[4851],np.max(x)
(1.3925838910372959, 4.927801355024724)

排序和使用索引

x = np.arange(16)
x
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
np.random.shuffle(x)  # 对x进乱序
x 
array([13,  9,  3, 15,  8, 12,  6,  2, 11,  4, 14,  5,  7, 10,  1,  0])
np.sort(x)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])

使用索引

np.random.shuffle(x)
x 
array([ 4, 15,  9,  1,  5,  3, 14,  8,  7, 12,  2, 11, 10,  0, 13,  6])
index_sort = np.argsort(x)
index_sort
array([13,  3, 10,  5,  0,  4, 15,  8,  7,  2, 12, 11,  9, 14,  6,  1],
      dtype=int64)
x[index_sort]
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])

Fancy index

Fancy Indexing 应用在二维数组

传入一个列表 返回这个列表中对应下标的元素

import numpy as np

x = np.arange(16)
x
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
X = x.reshape(4, -1)
X
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
row = np.array([0, 1, 2])
col = np.array([1, 2, 3])
X[row, col]
array([ 1,  6, 11])

bool比较

X <2
array([[ True,  True, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])
X == X
array([[ True,  True,  True,  True],
       [ True,  True,  True,  True],
       [ True,  True,  True,  True],
       [ True,  True,  True,  True]])

bool比较在fancy index中的使用

np.sum(X<2, axis=0)
array([1, 1, 0, 0])
np.sum((X > 3) & (X< 10))
6
np.sum((X % 2 == 0) | (X > 10))
11
X[X< 5]
array([0, 1, 2, 3, 4])

位运算符,即运算符两边都是数组,最后得到也是数组

X
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

猜你喜欢

转载自blog.csdn.net/qq_41861526/article/details/88617626