numpy
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
下面是具体的案列实现,包括了numpy大部分常规操作,可以让开发者快速了解到numpy的使用过程。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# author : acker
# date : 2020/11/2
import numpy as np
# 创建一维数组的方式
print("创建数组的方式")
arrs_a = np.arange(1,7).astype(int)
# arrs_b = np.array(range(1,7),dtype=int)
# arrs_c = np.array([1,2,3,4,5,6],dtype=int)
print('arrs_a\n',arrs_a)
# 创建二维数组的方式
arrs_aa = np.array([np.arange(1,4),np.arange(4,7)])
# arrs_aa = np.array([[1,2,3],[4,5,6]])
print('arrs_aa\n',arrs_aa)
print('*'*100)
# 查看数组的形状
print('查看数组的形状')
print('arrs_a的维度是:',arrs_a.shape)
print('arrs_aa的维度是:',arrs_aa.shape)
# 修改数组的形状
print('修改数组的形状')
print('arrs_a修改后\n',arrs_a.reshape(2,3))
print('arrs_aa修改后\n',arrs_aa.reshape(6,))
print('flatten将数组转换为一维数组\n',arrs_aa.flatten())
print('*'*100)
print('广播机制')
# 广播机制
print('加减乘除法会广播到每一个元素上,例如+1\n',arrs_a+1)
# 两个数组对应的最后存储的元素个数要相同才可以进行相应操作
# 例如shape为(2,2)的数组与shape为(2,3)的数组因为最后维度存储的个数不同会导致广播机制不能传播
# 例如shape为(2,2,3)的数组与shape为(1,1,3)不管其是几维数组只要其最后存储的元素个数相同就可以进行广播
print('数组与数组间的加减乘除,必须要最后的维度相同才可以进行,例如\n',np.array([1,2,3])+arrs_aa)
print('多维数组的加减乘除,例如\n',np.array([[[1,1,1],[1,1,1]],[[2,2,2],[2,2,2]]])+np.array([[[2,2,2]]]))
print('*'*100)
print('轴的概念')
# numpy中可以理解为方向使用0,1,2数字来表示不同的维度,
# 一维数组只有0轴,相当于只有x轴的概念
print('一维数组x为6\n',np.arange(6))
# 二维数组只有0,1轴,相当于x、y轴的概念,0表示为行数,1表示为列数
print('二维数组x为2,y为3\n',np.array([np.arange(3),np.arange(3)]))
# 三维数组只有0,1,2轴,相当于z、x、y轴的概念,0表示为块数,1表示为行数,2表示列数
print('三维数组z为1,x为2,y为3\n',np.array([[np.arange(3),np.arange(3)]]))
print('*'*100)
print('数组的转置')
print('arrs_aa\n',arrs_aa)
print('arrs_aa.transpose()\n',arrs_aa.transpose())
print('arrs_aa.T\n',arrs_aa.T)
# 转置与交换轴的效果一样
print('arrs_aa.swapaxes(1,0)\n',arrs_aa.swapaxes(1,0))
print('*'*100)
print('numpy索引和切片')
# 取出操作与数组的操作基本相似,只是增加了对x,y两个轴的取值方式arrs_aa[:,:],
print('arrs_aa\n',arrs_aa)
print('取arrs_aa的一行数据\n',arrs_aa[0])
print('取arrs_aa的一列数据\n',arrs_aa[:,0])
print('取arrs_aa的第一行的第一和第二列数据\n',arrs_aa[0,0:2])
print('*'*100)
print('numpy中布尔索引')
print('arrs_aa\n',arrs_aa)
print(arrs_aa<2)
# 修改了元数据
_arrs_aa = arrs_aa.copy()
_arrs_aa[_arrs_aa<2]=0
# 没有修改元数据,重新构造一个新的数组返回
# arrs_temp = np.where(arrs_aa<2,0,10)
print(arrs_aa)
print('*'*100)
print('numpy中的nan和inf')
# nan(NAN,Nan):not a number表示不是一个数字
# 读取为float,如果丢失,就会出现nan。
# nan与nan的值是不等的。
# nan与任何值计算都为nan
# inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷 如果有个数字除以0,例如:
# python中会将0表示为极小值,就会得出有个极大(小)值,就会导致程序报错出现inf
arrs_nan = np.arange(6).astype(float)
arrs_nan[1] = np.nan
print('arrs_nan\n',arrs_nan)
print('判断nan的个数',np.count_nonzero(arrs_nan!=arrs_nan))
print('判断是否为nan',np.isnan(arrs_nan))
print('*'*100)
print('numpy中常用统计函数')
print('arrs_aa\n',arrs_aa)
print('求和:',arrs_aa.sum() )
print('均值(受离群点的影响较大):',arrs_aa.mean() )
print('中值:',np.median(arrs_aa))
print('最大值',arrs_aa.max() )
print('最小值',arrs_aa.min() )
print('极值(即最大值和最小值只差):',np.ptp(arrs_aa) )
print('标准差',arrs_aa.std() )
print('*'*100)
print('numpy中数组的拼接')
print('arrs_a\n',arrs_a.reshape(2,3))
print('arrs_aa\n',arrs_aa)
print('竖直拼接np.vstack((t1,t2))]\n',np.vstack((arrs_a.reshape(2,3),arrs_aa)))
print('水平拼接np.hstack((t1,t2))]\n',np.hstack((arrs_a.reshape(2,3),arrs_aa)))
# 获取最大值最小值的位置
# np.argmax(t,axis=0)
# np.argmin(t,axis=1)
# 创建一个全0的数组: np.zeros((3,4))
# 创建一个全1的数组:np.ones((3,4))
# 创建一个对角线为1的正方形数组(方阵):np.eye(3)
print('numpy的注意点copy和view')
# a=b 完全不复制,a和b相互影响
# a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
# a = b.copy(),复制,a和b互不影响