Numpy学习

Numpy学习

1.1 认识Numpy数组对象

Numpy是一个用python实现的科学计算的扩展程序库,包括:

  • 一个强大的N维数据对象Array
  • 比较成熟的函数库
  • 用于整合C/C++和Fortran代码工具包
  • 使用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
import numpy as np  #导入numpy工具包
data = np.arange(12).reshape(3,4)
data

array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

type(data)

numpy.ndarray

data.ndim  #数组维度个数,输出结果为2,表示二维数组

2

data.shape   #数组的维度,输出结果(3,4)表示3行4列

(3, 4)

data.size   #数组元素的个数,输出结果12,表示总共有12个元素

12

data.dtype   #数组元素的类型,输出结果dtype('int32'),表示元素类型是int32

dtype(‘int32’)

1.2 创建Numpy数组

data1 = np.array([1,2,3])   #创建一个一维数组
data1

array([1, 2, 3])

data2 = np.array([[1,2,3],[4,5,6]])  #创建一个二维数组
data2

array([[1, 2, 3],
[4, 5, 6]])

np.zeros((3,4))  #创建一个全0数组

array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])

np.ones((3,4))  #船舰一个全1数组

array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])

np.empty((5,2))  #创建全空数组,其实每个值都是接近于0的数

array([[6.23042070e-307, 1.89146896e-307],
[1.37961302e-306, 7.56593017e-307],
[1.33511290e-306, 1.78018403e-306],
[1.95821439e-306, 8.01097889e-307],
[8.45596650e-307, 1.24610723e-306]])

np.arange(1,20,5)   #1-20的数,间隔5

array([ 1, 6, 11, 16])

np.array([1,2,3,4],float)    #创建一维数组,类型为float

array([1., 2., 3., 4.])

np.ones((2,3),dtype='float64')      #创建一个二维数组,类型为float64

array([[1., 1., 1.],
[1., 1., 1.]])

1.3 ndarry对象的数据类型

1.3.1 查看数据类型

data_one = np.array([[1,2,3],[4,5,6]])
data_one.dtype.name

‘int32’

1.3.2 转换数据类型

data = np.array([[1,2,3],[4,5,6]])
data.dtype

dtype(‘int32’)

float_data = data.astype(np.float64)  #类型转换为float64
float_data.dtype

dtype(‘float64’)

float_data = np.array([1.2,2.3,3.5])
float_data

array([1.2, 2.3, 3.5])

int_data = float_data.astype(np.int64)    #数据类型转换为int64
int_data

array([1, 2, 3], dtype=int64)

str_data = np.array(['1','2','3'])
int_data = str_data.astype(np.int64)
int_data

array([1, 2, 3], dtype=int64)

1.4 数组运算

1.4.1 向量化运算

data1 = np.array([[1,2,3],[4,5,6]])
data2 = np.array([[1,2,3],[4,5,6]])
data1 + data2   #数组相加

array([[ 2, 4, 6],
[ 8, 10, 12]])

data1 * data2   #数组相乘

array([[ 1, 4, 9],
[16, 25, 36]])

data1 - data2  #数组相减

array([[0, 0, 0],
[0, 0, 0]])

data1 / data2

array([[1., 1., 1.],
[1., 1., 1.]])

1.4.2 数据广播

arr1 = np.array([[0],[1],[2],[3]])
arr1.shape

(4, 1)

arr2 = np.array([1,2,3])
arr2.shape

(3,)

arr1 + arr2    #广播操作

array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])

1.4.3 数组与标量间的运算

data1 = np.array([[1,2,3],[4,5,6]])
data2 = 10
data1 + data2   #数组想加

array([[11, 12, 13],
[14, 15, 16]])

data1 * data2   #数组相乘

array([[10, 20, 30],
[40, 50, 60]])

data1 - data2    #数组相减

array([[-9, -8, -7],
[-6, -5, -4]])

data1 / data2    #数组相除

array([[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6]])

1.5 ndarry的索引与切片

1.5.1 整数索引与切片的基本使用

arr = np.arange(8)  #创建一个一维数组
arr

array([0, 1, 2, 3, 4, 5, 6, 7])

arr[5]  #获取索引为5的元素

5

arr[3:5]    #获取索引为3-5的元素 不包括5

array([3, 4])

arr[1:6:2]   #获取索引为1~6的元素,步长为2

array([1, 3, 5])

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])   #创建二维数组
arr2d

array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

arr2d[1]         #获取索引为1的元素

array([4, 5, 6])

arr2d[0,1]       #获取第0行第1列的元素

2

arr2d[:2]       #获取第0~2行的元素  不包括第2行

array([[1, 2, 3],
[4, 5, 6]])

arr2d[0:2,0:2]     

array([[1, 2],
[4, 5]])

arr2d[1,:2]

array([4, 5])

1.5.2 花式(数组)索引的基本使用

demo_arr = np.empty((4,4))     #创建一个空数组
for i in range(4):
    demo_arr[i] = np.arange(i, i + 4)         #动态的为数组添加元素
demo_arr

array([[0., 1., 2., 3.],
[1., 2., 3., 4.],
[2., 3., 4., 5.],
[3., 4., 5., 6.]])

demo_arr[[0,2]]        #获取索引为[0,2]的元素

array([[0., 1., 2., 3.],
[2., 3., 4., 5.]])

demo_arr[[1,3],[1,2]]      #获取索引为(1,1)和(3,2)的元素

array([2., 5.])

1.5.3 布尔型

#存储学生姓名的数组
student_name = np.array(['Tom','Lily','Jack','Rose'])
student_name

array([‘Tom’, ‘Lily’, ‘Jack’, ‘Rose’], dtype=’

#存储学生姓名成绩的数组
student_score = np.array([[179,88,80],[89,90,92],[83,78,85],[78,76,80]])
student_score

array([[179, 88, 80],
[ 89, 90, 92],
[ 83, 78, 85],
[ 78, 76, 80]])

#对student_name和字符串'jack'通过运算符产生一个布尔型数组
student_name == 'Jack'

array([False, False, True, False])

# 将布尔数组作为索引应用于存储成绩的数组student_score,
# 返回的数据是True值对应的行
student_score[student_name=='Jack',:1]

array([[83]])

1.6 数组的转置和轴对称

arr = np.arange(12).reshape(3,4)
arr

array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

arr.T           #使用T属性数组进行转置

array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])

arr = np.arange(16).reshape((2,2,4))
arr

array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],

[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])

arr.transpose(1,2,0)     #使用transpose()方法对数组进行转置

array([[[ 0, 8],
[ 1, 9],
[ 2, 10],
[ 3, 11]],

[[ 4, 12],
[ 5, 13],
[ 6, 14],
[ 7, 15]]])

arr

array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],

[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])

arr.swapaxes(1,0)     #使用swapaxes方法对数组进行转置

array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],

[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])

1.7 Numpy通用函数

arr = np.array([4,9,16])
np.sqrt(arr)   #开方

array([2., 3., 4.])

np.abs(arr)   #求绝对值

array([ 4, 9, 16])

np.square(arr)    #求平方

array([ 16, 81, 256], dtype=int32)

x = np.array([12,9,13,15])
y = np.array([11,10,4,8])
np.add(x,y)    #计算两个数组之和

array([23, 19, 17, 23])

np.multiply(x, y)     #计算两个数组的乘积

array([132, 90, 52, 120])

np.maximum(x, y)   #两个数组元素级最大值的比较

array([12, 10, 13, 15])

np.greater(x, y) #执行元素级的比较操作

array([ True, False, True, True])

1.8 利用Numpy数组进行数据处理

1.8.1 将条件逻辑转换为数组运算

arr_x = np.array([1,5,7])
arr_y = np.array([2,6,8])
arr_con = np.array([True,False,True])
result = np.where(arr_con,arr_x,arr_y)      #满足条件(condition),输出x,不满足输出y
result

array([1, 6, 7])

1.8.2 数组统计运算

arr = np.arange(10)
arr.sum()    #求和

45

arr.mean()     #求平均值

4.5

arr.min()     #求最小值

0

arr.max()      #求最大值

9

arr.argmax()     #求最大值索引

9

arr.argmin()     #求最小值索引

0

arr.cumsum()    #计算元素的累继和

array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45], dtype=int32)

x = np.arange(1, 16).reshape((3,5))
print(x)

[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]

np.diff(x,axis = 1)    #默认axis=1,后一个值减去前一个

array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])

np.diff(x,axis = 0)    

array([[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5]])

np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])    #向下取整

array([-1., -2., -1., -2., 0., 1., 1.])

np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])  #向上取整

array([ 2., 2., 2., 3., 2., -0., -0., -0.])

x = np.array([[1,0],[2,-2],[-2,1]])
print(x)
np.where(x > 0, x, 0)

[[ 1 0]
[ 2 -2]
[-2 1]]

array([[1, 0],
[2, 0],
[0, 1]])

1.8.3 数组排序

arr = np.array([[6,2,7],[3,6,2],[4,3,2]])
arr

array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])

arr.sort()
arr

array([[2, 6, 7],
[2, 3, 6],
[2, 3, 4]])

arr = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])
arr

array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])

arr.sort(0)      # 沿着编号为0的轴对元素排序
arr

array([[3, 2, 2],
[4, 3, 2],
[6, 6, 7]])

1.8.4 检索数组元素

arr = np.array([[1,-2,-7],[-3,6,2],[-4,3,2]])
arr

array([[ 1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])

np.any(arr > 0)     #arr中所有元素是否有一个大于0

True

np.all(arr > 0)    #arr的所有元素是否都大于0

False

1.8.5 唯一化及其他集合逻辑

arr = np.array([12,11,34,23,12,8,11])
np.unique(arr)

array([ 8, 11, 12, 23, 34])

np.in1d(arr,[11,12])

array([ True, True, False, False, True, False, True])

1.9 线性代数模块

arr_x = np.array([[1,2,3],[4,5,6]])
arr_y = np.array([[1,2],[3,4],[5,6]])
arr_x.dot(arr_y)      #等价于np.dot(arr_x,arr_y)

array([[22, 28],
[49, 64]])

1.10 随机数模块

np.random.rand(3,3)   #随机生成一个二维数组

array([[0.71541777, 0.82501365, 0.13452841],
[0.22434711, 0.06148614, 0.89242706],
[0.02936374, 0.14336045, 0.88000814]])

np.random.rand(2,3,3)   #随即生成一个三维数组

array([[[0.68720106, 0.85088306, 0.06901039],
[0.94445033, 0.56362904, 0.81075899],
[0.10805486, 0.07066545, 0.71697837]],

[[0.62597042, 0.28651044, 0.4481899 ],
[0.61462445, 0.45785905, 0.14678526],
[0.3352477 , 0.99530172, 0.88398376]]])

np.random.seed(0)      #生成随机数的种子,保证生成的随机数都一样
np.random.rand(5)      #随机生成包含5个元素的浮点数组

array([0.64589411, 0.43758721, 0.891773 , 0.96366276, 0.38344152])

np.random.seed()      #没有设置随机数种子  ,每次随机生成的数据都不一样
np.random.rand(5)

array([0.32487821, 0.35618615, 0.71714683, 0.94454022, 0.21145835])

Reference
  • 微信公众号 机器学习初学者

你可能感兴趣的:(python)