Numpy的使用
一、Array数组简介
import numpy as np
np. __version__
'1.18.1'
nparr = np. array( [ i for i in range ( 10 ) ] )
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr[ 4 ]
4
nparr[ 4 ] = 12
nparr[ 4 ]
12
nparr2 = np. array( [ 1 , 2 , 3.0 ] )
nparr2. dtype
dtype('float64')
二、其他创建np的数组方法
np. zeros( 10 )
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np. zeros( 10 ) . dtype
dtype('float64')
np. ones( shape= ( 3 , 5 ) , dtype= int )
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
np. full( shape= ( 3 , 5 ) , fill_value= 10.0 )
array([[10., 10., 10., 10., 10.],
[10., 10., 10., 10., 10.],
[10., 10., 10., 10., 10.]])
arange循环
np. arange( 0 , 20 , 2 )
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
np. arange( 2 , 17 ) . reshape( 3 , 5 )
array([[ 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16]])
linspace 在指定全闭空间截取等长的指定长度
np. linspace( 0 , 20 , 11 )
array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20.])
随机数random
np. random. randint( 4 , 8 , size= ( 3 , 5 ) )
array([[7, 4, 5, 5, 4],
[5, 4, 7, 6, 7],
[5, 5, 7, 7, 7]])
np. random. seed( 100 )
np. random. randint( 4 , 8 , size= ( 3 , 5 ) )
array([[4, 4, 7, 7, 7],
[7, 4, 6, 6, 4],
[6, 5, 6, 6, 6]])
np. random. seed( 100 )
np. random. randint( 4 , 8 , size= ( 3 , 5 ) )
array([[4, 4, 7, 7, 7],
[7, 4, 6, 6, 4],
[6, 5, 6, 6, 6]])
np. random. random( ( 4 , 8 ) )
array([[0.4527399 , 0.87014264, 0.06368104, 0.62431189, 0.52334774,
0.56229626, 0.00581719, 0.30742321],
[0.95018431, 0.12665424, 0.07898787, 0.31135313, 0.63238359,
0.69935892, 0.64196495, 0.92002378],
[0.29887635, 0.56874553, 0.17862432, 0.5325737 , 0.64669147,
0.14206538, 0.58138896, 0.47918994],
[0.38641911, 0.44046495, 0.40475733, 0.44225404, 0.03012328,
0.77600531, 0.55095838, 0.3810734 ]])
np. random. normal( 4 , 10 , size= ( 3 , 5 ) )
array([[ 9.92575746, 4.37958129, 7.71967572, 7.59753947, 2.59603535],
[-0.43738512, 9.68770162, 9.38488768, 17.15574179, 18.78978297],
[ 6.21426255, -7.17894159, 2.1500007 , -0.31187446, 5.42536252]])
np. random. normal?
三、数组的基本属性
x = np. arange( 10 )
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
X = np. arange( 15 ) . reshape( 3 , 5 )
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
x. ndim
1
X. ndim
2
x. shape
(10,)
X. shape
(4, 3)
X. shape[ 0 ]
4
x. size
10
X. size
12
数据访问
x[ - 1 ]
9
X[ 2 , 2 ]
12
x[ : : 2 ]
array([0, 2, 4, 6, 8])
x[ : : - 1 ]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
X[ : 2 , : 3 ]
array([[0, 1, 2],
[5, 6, 7]])
X[ : , 2 ]
array([ 2, 7, 12])
X[ 1 , : ]
array([5, 6, 7, 8, 9])
subX = X[ : 2 , : 3 ]
subX
array([[0, 1, 2],
[5, 6, 7]])
subX[ 0 , 2 ] = 10
subX
array([[ 0, 1, 10],
[ 5, 6, 7]])
X
array([[ 0, 1, 10, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
subX = X[ : 2 , : 3 ] . copy( )
subX
array([[ 0, 1, 10],
[ 5, 6, 7]])
subX[ 0 , 0 ] = 100
subX
array([[100, 1, 10],
[ 5, 6, 7]])
X
array([[ 0, 1, 10, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
Reshape改变维度
x1 = np. arange( 10 )
x1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1. ndim
1
x1. shape
(10,)
A = x1. reshape( 2 , 5 )
x1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
A
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
A. reshape( 10 , - 1 )
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
A. reshape( 2 , - 1 )
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
合并操作
x = np. array( [ 1 , 2 , 3 ] )
y = np. array( [ 3 , 2 , 1 ] )
x
array([1, 2, 3])
y
array([3, 2, 1])
z = np. array( [ 7 , 7 , 7 ] )
np. concatenate( [ x, y, z] )
array([1, 2, 3, 3, 2, 1, 7, 7, 7])
A = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
A
array([[1, 2, 3],
[4, 5, 6]])
np. concatenate( [ A, A] )
array([[1, 2, 3],
[4, 5, 6],
[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]])
T = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
t = np. array( [ 7 , 7 , 7 ] )
np. vstack( [ T, t] * 2 )
array([[1, 2, 3],
[4, 5, 6],
[7, 7, 7],
[1, 2, 3],
[4, 5, 6],
[7, 7, 7]])
B = np. full( shape= ( 2 , 2 ) , fill_value= 22 )
np. hstack( [ A, B] )
array([[ 1, 2, 3, 22, 22],
[ 4, 5, 6, 22, 22]])
分割
x = np. arange( 10 )
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1, x2, x3 = np. split( x, [ 3 , 7 ] )
x1
array([0, 1, 2])
x2
array([3, 4, 5, 6])
x3
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 ] )
A1
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
A2
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
A1, A2 = np. split( A, [ 1 ] , axis= 1 )
A1
array([[ 0],
[ 4],
[ 8],
[12]])
A2
array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11],
[13, 14, 15]])
A1, A2 = np. hsplit( A, [ 2 ] )
A1
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
A2
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
X, y = np. hsplit( A, [ - 1 ] )
X
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]])
y
array([[ 3],
[ 7],
[11],
[15]])
y = y[ : , 0 ]
y
array([ 3, 7, 11, 15])
四、数组运算
L = np. array( [ 1 , 2 , 3 ] )
L
array([1, 2, 3])
A = 2 * L
A
array([2, 4, 6])
A
array([2, 4, 6])
A = L ** 2
A
array([1, 4, 9], dtype=int32)
A = L / 2
A
array([0.5, 1. , 1.5])
A = L // 2
A
array([0, 1, 1], dtype=int32)
A = L % 2
A
array([1, 0, 1], dtype=int32)
A = np. arange( 4 ) . reshape( 2 , 2 )
A
array([[0, 1],
[2, 3]])
B = np. full( fill_value= 10 , shape= ( 2 , 2 ) )
B
array([[10, 10],
[10, 10]])
A + B
array([[10, 11],
[12, 13]])
A. dot( B)
array([[10, 10],
[50, 50]])
A. T
array([[0, 2],
[1, 3]])
向量和矩阵的运算
v = np. array( [ 1 , 2 ] )
v
array([1, 2])
np. tile( v, ( 2 , 1 ) ) + A
array([[1, 3],
[3, 5]])
np. vstack( [ v] * A. shape[ 0 ] ) + A
array([[1, 3],
[3, 5]])
v+ A
array([[1, 3],
[3, 5]])
v. dot( A)
array([4, 7])
A. dot( v)
array([2, 8])
求矩阵的逆
A
array([[0, 1],
[2, 3]])
invA = np. linalg. inv( A)
invA
array([[-1.5, 0.5],
[ 1. , 0. ]])
invA. dot( A)
array([[1., 0.],
[0., 1.]])
A. dot( invA)
array([[1., 0.],
[0., 1.]])
P = np. arange( 6 ) . reshape( 2 , 3 )
P
array([[0, 1, 2],
[3, 4, 5]])
invP = np. linalg. inv( P)
invP
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-197-cea414d9d476> in <module>
----> 1 invP = np.linalg.inv(P)
2 invP
<__array_function__ internals> in inv(*args, **kwargs)
D:\python\annaconda\lib\site-packages\numpy\linalg\linalg.py in inv(a)
540 a, wrap = _makearray(a)
541 _assert_stacked_2d(a)
--> 542 _assert_stacked_square(a)
543 t, result_t = _commonType(a)
544
D:\python\annaconda\lib\site-packages\numpy\linalg\linalg.py in _assert_stacked_square(*arrays)
211 m, n = a.shape[-2:]
212 if m != n:
--> 213 raise LinAlgError('Last 2 dimensions of the array must be square')
214
215 def _assert_finite(*arrays):
LinAlgError: Last 2 dimensions of the array must be square
invP = np. linalg. pinv( P)
invP
array([[-0.77777778, 0.27777778],
[-0.11111111, 0.11111111],
[ 0.55555556, -0.05555556]])
P
array([[0, 1, 2],
[3, 4, 5]])
P. dot( invP)
array([[ 1.00000000e+00, -1.11022302e-16],
[ 2.66453526e-15, 1.00000000e+00]])
聚合操作
c = np. random. random( 100 )
c
array([0.67731747, 0.8097996 , 0.44306924, 0.10924103, 0.97039241,
0.38847984, 0.446539 , 0.19115508, 0.89116032, 0.47422759,
0.21237979, 0.60914912, 0.51770333, 0.40296099, 0.32301995,
0.5885746 , 0.38878152, 0.45094951, 0.24692106, 0.5795789 ,
0.95588068, 0.59444006, 0.28505391, 0.07476922, 0.56237941,
0.18774368, 0.57311471, 0.13546506, 0.37562767, 0.33001114,
0.547794 , 0.19797026, 0.25155065, 0.80938403, 0.92580965,
0.89988772, 0.43454589, 0.02134634, 0.78510132, 0.18258255,
0.57643742, 0.35635898, 0.76286615, 0.53281217, 0.36405572,
0.41126815, 0.24624624, 0.11203632, 0.21297768, 0.69958934,
0.92405496, 0.89076414, 0.35501525, 0.82317797, 0.38149612,
0.03400909, 0.88722056, 0.4971579 , 0.02616028, 0.8918212 ,
0.99259084, 0.28025065, 0.44650545, 0.85163306, 0.47433037,
0.27746328, 0.84165882, 0.19512497, 0.8563142 , 0.30779172,
0.11482631, 0.23205323, 0.1901128 , 0.89687523, 0.71286647,
0.27232044, 0.33140446, 0.13344876, 0.47179231, 0.87548878,
0.65723473, 0.73897465, 0.83128974, 0.78972567, 0.75736278,
0.5927053 , 0.21856877, 0.48801456, 0.62094638, 0.95552635,
0.24609705, 0.07953832, 0.49838666, 0.43576678, 0.29923313,
0.48928621, 0.89216675, 0.50743572, 0.36042688, 0.90388633])
np. sum ( c)
49.95480883325486
np. min ( c)
0.0213463370361493
C = np. arange( 16 ) . reshape( 4 , - 1 )
C
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
np. sum ( C)
120
np. sum ( C, axis= 0 )
array([24, 28, 32, 36])
np. sum ( C, axis= 1 )
array([ 6, 22, 38, 54])
np. prod( C)
0
np. mean( C)
7.5
np. median( C)
7.5
np. percentile( c, q= 50 )
0.47300995170104476
np. median( c)
0.47300995170104476
for percent in ( 0 , 25 , 50 , 75 , 100 ) :
print ( np. percentile( c, q = percent) )
0.0213463370361493
0.27617756624264767
0.47300995170104476
0.758738621791756
0.9925908422814628
np. var( c)
0.07401029029118417
np. std( c)
0.27204832344858176
索引
d = np. random. normal( 0 , 1 , size= 1000000 )
d
array([ 0.61285995, -0.9236127 , -0.92116938, ..., -0.4371244 ,
2.20229359, 0.48357591])
np. min ( d)
-4.621589291745685
np. argmin( d)
538778
d = np. arange( 16 )
d
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
np. random. shuffle( d)
d
array([ 5, 15, 1, 14, 10, 4, 7, 6, 12, 8, 0, 13, 9, 3, 2, 11])
np. sort( d)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
D = np. random. randint( 10 , size= ( 4 , 4 ) )
D
array([[7, 3, 0, 4],
[0, 4, 2, 1],
[6, 5, 3, 6],
[7, 3, 7, 3]])
np. sort( D)
array([[0, 3, 4, 7],
[0, 1, 2, 4],
[3, 5, 6, 6],
[3, 3, 7, 7]])
np. sort( D, axis= 0 )
array([[0, 3, 0, 1],
[6, 3, 2, 3],
[7, 4, 3, 4],
[7, 5, 7, 6]])
d
array([ 5, 15, 1, 14, 10, 4, 7, 6, 12, 8, 0, 13, 9, 3, 2, 11])
np. argsort( d)
array([10, 2, 14, 13, 5, 0, 7, 6, 9, 12, 4, 15, 8, 11, 3, 1],
dtype=int64)
np. partition( d, 3 )
array([ 0, 1, 2, 3, 4, 5, 6, 15, 12, 8, 7, 13, 9, 10, 14, 11])
np. argpartition( d, 3 )
array([10, 2, 14, 13, 5, 0, 7, 1, 8, 9, 6, 11, 12, 4, 3, 15],
dtype=int64)
D
array([[7, 3, 0, 4],
[0, 4, 2, 1],
[6, 5, 3, 6],
[7, 3, 7, 3]])
np. argsort( D, axis= 1 )
array([[2, 1, 3, 0],
[0, 3, 2, 1],
[2, 1, 0, 3],
[1, 3, 0, 2]], dtype=int64)
np. partition( D, 3 , axis= 0 )
array([[6, 3, 0, 1],
[0, 3, 2, 3],
[7, 4, 3, 4],
[7, 5, 7, 6]])
Fancy Indexing
e = np. arange( 16 )
e
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
e[ 3 : 9 : 2 ]
array([3, 5, 7])
indx = [ 3 , 5 , 8 ]
e[ indx]
array([3, 5, 8])
index = np. array( [ [ 0 , 2 ] , [ 1 , 3 ] ] )
e[ index]
array([[0, 2],
[1, 3]])
E = e. reshape( 4 , - 1 )
E
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 ] )
E[ row, col]
array([ 1, 6, 11])
E[ : 2 , col]
array([[1, 2, 3],
[5, 6, 7]])
col = [ True , False , True , True ]
E[ 1 : 3 , col]
array([[ 4, 6, 7],
[ 8, 10, 11]])
numpy的比较
e
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
e < 3
array([ True, True, True, False, False, False, False, False, False,
False, False, False, False, False, False, False])
E
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
E < 6
array([[ True, True, True, True],
[ True, True, False, False],
[False, False, False, False],
[False, False, False, False]])
2 * E == 24 - 4 * E
array([[False, False, False, False],
[ True, False, False, False],
[False, False, False, False],
[False, False, False, False]])
E != 6
array([[ True, True, True, True],
[ True, True, False, True],
[ True, True, True, True],
[ True, True, True, True]])
np. sum ( E <= 3 )
4
np. count_nonzero( E <= 3 )
4
np. any ( E == 0 )
True
np. all ( E >= 1 )
False
np. sum ( E% 2 == 0 , axis= 0 )
array([4, 0, 4, 0])
np. sum ( ( e % 2 == 0 ) | ( e > 10 ) )
11
E[ E[ : , 3 ] % 3 == 0 , : ]
array([[ 0, 1, 2, 3],
[12, 13, 14, 15]])