numpy的基础知识

192 阅读6分钟

导入numpy的包,一般都会定义成np

import numpy

查看numpy的版本

numpy.__version__
'1.20.3'

一般将numpy 定义成np,便于后续的使用

import numpy as np

查看numpy的版本

np.__version__
'1.20.3'

Python List的特点

L = [i for i in range(10)]
L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[5]
5
L[5] = 100
L
[0, 1, 2, 3, 4, 100, 6, 7, 8, 9]
L[5] = "Machine Learning"
L
[0, 1, 2, 3, 4, 'Machine Learning', 6, 7, 8, 9]

array 的特点

import array
arr = array.array('i', [i for i in range(10)])
arr
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5]
5
arr[5] = 100
arr
array('i', [0, 1, 2, 3, 4, 100, 6, 7, 8, 9])

array也可以像python list一样使用

numpy.array

nparr = np.array([i for i in range(10)])
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr[5]
5
nparr[5] = 100
nparr
array([  0,   1,   2,   3,   4, 100,   6,   7,   8,   9])
nparr.dtype
dtype('int32')
nparr[5] = 5.0
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr.dtype
dtype('int32')
nparr[3] = 3.19
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr.dtype
dtype('int32')
nparr2 = np.array([1,2,3.0])
nparr2.dtype
dtype('float64')

其他创建numpy.array的方法

创建都是0的向量

np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

向量的类型默认是都典型

np.zeros(10).dtype
dtype('float64')

可以在生成的时候定义类型

np.zeros(10,dtype=int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.zeros((3,5))
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

shape可以定义生成的维度(几行几列)

np.zeros(shape=(3,5), dtype=int)
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

ones是生成的元素都为1

np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3,5))
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

full可以定义生成元素为几

np.full((3,5),66)
array([[66, 66, 66, 66, 66],
       [66, 66, 66, 66, 66],
       [66, 66, 66, 66, 66]])
np.full(shape=(3,5),fill_value=66)
array([[66, 66, 66, 66, 66],
       [66, 66, 66, 66, 66],
       [66, 66, 66, 66, 66]])

arange和python中的range类似,但是arange步长可以是小数

# arange
[i for i in range(0, 20, 2)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
np.arange(0,20,2)
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
np.arange(0, 1, 0.2)
array([0. , 0.2, 0.4, 0.6, 0.8])
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

linspace 截取

np.linspace(0, 20, 10)
# 从0到20截取等长的10个点(包含20)
array([ 0.        ,  2.22222222,  4.44444444,  6.66666667,  8.88888889,
       11.11111111, 13.33333333, 15.55555556, 17.77777778, 20.        ])

random 随机生成数,前两个数是范围,后一个数十生成的数量,前闭后开

np.random.randint(0,10)

9
np.random.randint(0,10,10)
array([9, 9, 0, 7, 8, 4, 0, 1, 6, 5])
np.random.randint(4, 8, size=(3,5))
array([[7, 7, 5, 6, 5],
       [4, 7, 4, 5, 6],
       [6, 6, 5, 7, 4]])

可以定义一个seed,在下一次使用的时候生成一样的

np.random.seed(666)
np.random.randint(4, 8, size=(3,5))
array([[4, 6, 5, 6, 6],
       [6, 5, 6, 4, 5],
       [7, 6, 7, 4, 7]])
np.random.seed(666)
np.random.randint(4, 8, size=(3,5))
array([[4, 6, 5, 6, 6],
       [6, 5, 6, 4, 5],
       [7, 6, 7, 4, 7]])

生成10个数

np.random.random(10)
array([0.46284169, 0.23340091, 0.76706421, 0.81995656, 0.39747625,
       0.31644109, 0.15551206, 0.73460987, 0.73159555, 0.8578588 ])

生成一个三行五列的数组

np.random.random((3,5))
array([[0.76741234, 0.95323137, 0.29097383, 0.84778197, 0.3497619 ],
       [0.92389692, 0.29489453, 0.52438061, 0.94253896, 0.07473949],
       [0.27646251, 0.4675855 , 0.31581532, 0.39016259, 0.26832981]])

random.normal生成正态分布上的数

np.random.normal()
0.7760516793129695
np.random.normal(10, 100)
16.102403954600113
np.random.normal(0, 1, (3,5))
array([[ 1.07856138, -0.79783572,  1.1701326 ,  0.1121217 ,  0.03185388],
       [-0.19206285,  0.78611284, -1.69046314, -0.98873907,  0.31398563],
       [ 0.39638567,  0.57656584, -0.07019407,  0.91250436,  1.00470497]])

reshape 改变数组的行列

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]])

基本属性

ndim 维度

x.ndim
1
X.ndim
2
x.shape
(10,)
X.shape
(3, 5)

size 元素个数

x.size
10
X.size
15

numpy.array 的数据访问

x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[0]
0
x[-1]
9
X[0][0]
0
X[2,2]
12
x[0:5]
array([0, 1, 2, 3, 4])
x[:5]
array([0, 1, 2, 3, 4])
x[5:]
array([5, 6, 7, 8, 9])
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([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

再从前两行取前三行,所以结果如下

X[:2][:3]
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
X[:2,::2]
array([[0, 2, 4],
       [5, 7, 9]])
X[::-1,::-1]
array([[14, 13, 12, 11, 10],
       [ 9,  8,  7,  6,  5],
       [ 4,  3,  2,  1,  0]])
X[0]
array([0, 1, 2, 3, 4])
X[0,:]
array([0, 1, 2, 3, 4])
X[0,:].ndim
1
X[0].ndim
1
X[:, 0]
array([ 0,  5, 10])
X[:, 0].ndim
1
subX = X[:2,:3]
subX
array([[0, 1, 2],
       [5, 6, 7]])

改变其中的元素

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

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
subX
array([[0, 1, 2],
       [5, 6, 7]])
subX = X[:2,:3].copy()
subX
array([[0, 1, 2],
       [5, 6, 7]])
subX[0,0] = 100
subX
array([[100,   1,   2],
       [  5,   6,   7]])
X
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

reshape 改变维度


x.shape

(10,)
x.ndim
1
A = x.reshape(2,5)
A
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
B = x.reshape(1,10)
B
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
B.shape
(1, 10)
C = x.reshape(10,-1)
C
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
D = x.reshape(-1,10)
D
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

合并操作

x = np.array([1,2,3])
y = np.array([3,2,1])
np.concatenate([x, y])
array([1, 2, 3, 3, 2, 1])
z = np.array([66,66,66])
np.concatenate([x,y,z])
array([ 1,  2,  3,  3,  2,  1, 66, 66, 66])
A = np.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]])
np.concatenate([A,z.reshape(1,-1)])
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [66, 66, 66]])
A2 = np.concatenate([A,z.reshape(1,-1)])
A2
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [66, 66, 66]])
np.vstack([A,z])
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [66, 66, 66]])
B = np.full((2,2),100)
np.hstack([A,B])
array([[  1,   2,   3, 100, 100],
       [  4,   5,   6, 100, 100]])

分割操作

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])

从5分割

x1,x2 = np.split(x,[5])
x1
array([0, 1, 2, 3, 4])
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]])

从第2行分割

A1,A2 = np.split(A,[2])
A1
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

从第2列分割

A1,A2 = np.split(A,[2],axis=1)
A1
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])
upper, lower = np.vsplit(A,[2])
upper
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
left,right = np.hsplit(A,[2])
left
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])
data = np.arange(16).reshape((4,4))

举例,在机器学习中可能用到的

data
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
X, y = np.split(data, [-1],axis=1)
X
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10],
       [12, 13, 14]])
y
array([[ 3],
       [ 7],
       [11],
       [15]])