Python Numpy库用法笔记
- 一、简单了解Numpy
- 1.1通过ndarray存储数据
- 1.2 ndarray在计算中的优势
- 二、ndarray的属性
- 三、基本操作
- 3.1 生成数组的方法
- 3.1.1生成0和1
- 3.1.2 从现有数组中生成
- 3.1.3生成固定单位的数组
- 3.1.4 生成随机数组
- 3.2 数组的索引、切片
- 3.2.1 一维数组的切片、索引
- 3.2.2 二维数组的切片、索引
- 3.2.3 三维数组的切片、索引
- 3.3 形状的修改
- 3.4类型的修改
- 3.5数组的去重
- 四、ndarray运算
- 4.1 逻辑运算
- 4.1.1布尔索引
- 4.1.2通用判断
- 4.1.3 三元运算符
- 4.2 统计运算
- 4.2.1 统计指标
- 4.2.2 返回最大值、最小值的位置
- 4.3 数组间运算
- 4.3.1 数组与数的运算
- 4.3.1 数组与数组的运算
- 4.4 矩阵运算
- 4.4.1 矩阵存储方法
- 4.4.2 矩阵的乘法
- 五、ndarray的合并、分割
- 5.1ndarray的合并
- 5.2 ndarray的分割
- 六、IO操作与数据处理
用于日常学习的积累,如有不足请多多指教。
一、简单了解Numpy
Numpy可以看成是2个缩写单词拼接而成:
·num(numerical) 数值化的
·py(python)
Numpy→数值计算库
- Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
- Numpy使用ndarray对象来处理多维数组,该对象是一个快速而且灵活的大数据容器。
ndarray可以看成是3个缩写单词拼接而成:
·n任意个
·d(dimension)维度
·array数组
1.1通过ndarray存储数据
import numpy as np
np.array([[80,58,75,78],
[98,70,85,84],
[90,75,90,90],
[88,70,82,80]])
1.2 ndarray在计算中的优势
Numpy在计算中的优势
1.存储内容
1)ndarray存储数据类型相同且存储地址连续,但通用性不强
2)list存储数据类型可以不相同,存储地址不一定连续,但通用性强
2.ndarray支持并行化运算
3.Numpy底层使用C语言编写,数组操作不受Python解释器的影响,效率高于纯Python代码
- 代码示例:
import numpy as np
import time
import random
mylist=[i for i in range(100000000)]
myndarray=np.array(list)
start_time1=time.time()
sum(mylist)
end_time1=time.time()
start_time2=time.time()
np.sum(myndarray)
end_time2=time.time()
print(f"list运算时间:{end_time1-start_time1}")
print(f"ndarray运算时间:{end_time2-start_time2}")
结果:
二、ndarray的属性
属性名字 | 属性解释 |
ndarray.shape | 数组位的的元组 |
ndarray.dtype | 数组元素的类型 |
ndarray.ndim | 数组维度 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度 |
- 代码示例:
import numpy as np
output_value=np.array([[80,58,75,78],
[98,70,85,84],
[90,75,90,90],
[88,70,82,80]])
output_value.shape
output_value.dtype
output_value.ndim
output_value.size
output_value.itemsize
三、基本操作
3.1 生成数组的方法
3.1.1生成0和1
np.zeros(shape) #生成一组全是零的数组
npones(shape) #生成一组全是一的数组
- 代码示例:
np.zeros(shape=(4,4))
3.1.2 从现有数组中生成
np.array() #深拷贝
np.copy() #深拷贝
np.asarray() #浅拷贝
深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
浅拷贝只是一种简单的拷贝 拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间。
- 代码示例:
myarray=np.zeros(shape=(2,2))
array1=np.array(myarray)
array2=np.copy(myarray)
array3=np.asarray(myarray)
print(f"array1:\n{array1}\narray2:\n{array2}\narray3:\n{array3}\n")
myarray[0][0]=1
print(f"array1:\n{array1}\narray2:\n{array2}\narray3:\n{array3}\n")
结果:
3.1.3生成固定单位的数组
np.linspace(start,stop,num,...)
#start、stop→左闭右闭:[start, stop]
#num:生成等距离数据的个数
np.arange(start,stop,step,...)
#start、stop→左闭右闭:[start, stop)
#step是步长
#(与range(start,stop,step)类似)
- 代码示例:
np.linspace(0, 10, 5)
np.arange(0, 10, 2)
结果:
3.1.4 生成随机数组
np.random.uniform(low=-1,high=1,size=100) #均匀分布生成随机数
np.random.normal(loc=0.0,scale=1.0,size=None) #正态分布生成随机数
#loc:此概率分布的均值
#scale:此概率分布的标准差
#size:输出的shape
- 代码示例:
np.random.uniform(low=-1,high=1,size=100)
np.random.normal(loc=0.0,scale=1.0,size=100)
结果:
3.2 数组的索引、切片
3.2.1 一维数组的切片、索引
data=np.random.uniform(low=-1,high=1,size=10)
print(data)
#索引:第5个数据
print(data[4])
#切片:第3到5个数据
print(data[2:5])
结果:
3.2.2 二维数组的切片、索引
data2=np.array([[80,58,75,78],
[98,70,85,84],
[90,75,90,90],
[88,70,82,80]])
#索引:第2行第3个数据
print(data2[1,2])
#切片:第2行第2-3个数据
print(data2[1,1:3])
结果:
3.2.3 三维数组的切片、索引
data3=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
print(data3)
#索引
print(data3[1,0,1])
#切片
print(data3[0,1,0:2])
3.3 形状的修改
ndarray.reshape(shape) 返回新的ndarray,原始数据没有改变
ndarray.resize(shape) 没有返回值,对原始的ndarray进行了修改
ndarray.T 转置 行变成列,列变成行
data4=np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
print(data4.reshape(4,3)) #返回一个新的ndarray
print(data4)
data4.resize(4,3) #没有返回值
print(data4)
data4=np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
print(data4.T) #返回一个新的ndarray
print(data4)
结果:
3.4类型的修改
ndarray.astype(np.int64)
- 代码示例:
data4=np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
print(data4.dtype)
print(data4.astype(np.float64))
结果:
3.5数组的去重
np.unique(ndarray)
- 代码示例:
data5=np.array([[1,2,3,4],
[3,4,5,6],
[5,6,7,8]])
print(np.unique(data5)) #返回一个新的ndarray
#或者使用
#print(set(temp.flatten()))
结果:
四、ndarray运算
4.1 逻辑运算
4.1.1布尔索引
- 代码示例:
data5=np.array([[1,2,3,4],
[3,4,5,6],
[5,6,7,8]])
print(data5 > 5) #将data5中全部元素与5比较大小,并返回布尔值
data5[data5 > 5]=0 #提取data5中大于5的值
print(data5)
结果:
4.1.2通用判断
np.all(bool)
#全是True返回True
np.any(bool)
#有一个True返回True
- 代码示例:
data5[data5 > 5]=0
np.all(data5) #False
np.any(data5) #True
4.1.3 三元运算符
np.where(bool,改变True位置的值,改变False的位置的值)
np.logical_and()
np.logical_or()
- 代码示例:
np.where(data5,1,0) #np.where(data5!=0,1,0)
结果:
np.where(np.logical_and(data5>2,data5<5),1,0)
np.where(np.logical_or(data5>2,data5<5),1,0)
结果:
4.2 统计运算
4.2.1 统计指标
np.min(ndarray,axis,...)
np.max(ndarray,axis,...)
np.median(ndarray,axis,...)
np.mean(ndarray,axis,...)
np.std(ndarray,axis,...)
np.var(ndarray,axis,...)
#axis=1:按行计算
#axis=0:按列计算
- 代码示例:
np.max(data5,axis=1)
结果:
4.2.2 返回最大值、最小值的位置
np.argmax(temp, axis)
np.argmin(temp, axis)
- 代码示例:
np.argmax(data5,axis=1)
结果:
4.3 数组间运算
4.3.1 数组与数的运算
将数组内所有的数字分别与另外的数进行四则运算。
- 代码示例:
data5+1
data5*5
4.3.1 数组与数组的运算
当操作两个数组时,numpy会比较他们的形状(shape),当满足下列情况时才能进行运算:
- 维度相同
- shape中又一个位置为1
比如
①[[1,0],[0,4]]
shape(2,2)=> shape(1,2,2)
②[[[1,0],[0,4]],[[1,0],[0,4]]]
shape(2,2,2)①+②=[[[2, 0], [0, 8]], [[2, 0], [0, 8]]]
- 代码示例:
arr1=np.array([[1,2],[3,4]])
arr2=np.array([[1,0],[0,4]])
arr3=np.array([[1,1],[0,0],[2,2]])
arr4=np.array([[[1,0],[0,4]],[[1,0],[0,4]]])
arr2+arr4
arr1*arr2
arr2*arr3 #抛出异常,shape不同
结果:
4.4 矩阵运算
矩阵必须是二维的
4.4.1 矩阵存储方法
- ndarray的二维数组
- matrix
np.mat()
4.4.2 矩阵的乘法
矩阵乘法规则:
第一个矩阵列数=第二个矩阵行数
(m行,n列)*(n行,s列)=(m行,s列)
np.matmul(mat,mat)
np.dot()
- 代码示例:
np.matmul(arr1,arr2) #用ndarray存储时的运算
mat1=np.mat(arr1)
mat2=np.mat(arr2)
mat1*mat2
结果:
五、ndarray的合并、分割
5.1ndarray的合并
np.hstack(ndarray,ndarray) #水平拼接
np.vstack(ndarray,ndarray) #竖直拼接
np.concatenate((ndarray,ndarray,...),axis)
- 代码示例:
a=np.array([1,2])
b=np.array([3,4])
c=np.array([[5],[6]])
np.hstack((a,b))
np.concatenate((a,b),axis=0)
#array([1, 2, 3, 4])
np.vstack((a,b))
#array([[1, 2],
[3, 4]])
np.concatenate(((np.vstack((a,b))),c),axis=1)
#array([[1, 2, 5],
[3, 4, 6]])
结果:
5.2 ndarray的分割
np.split(ndarray,sections,axis)
- 代码示例:
a=np.arange(0,10)
#[0 1 2 3 4 5 6 7 8 9]
np.split(a,5)
#[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
np.split(a,[1,5,9])
#[array([0]), array([1, 2, 3, 4]), array([5, 6, 7, 8]), array([9])]
结果:
六、IO操作与数据处理
np.genfromtxt(path,delimiter)
#delimiter为分隔符
==注意:==无法读取字符串,会变成缺失值
解决方法:
1)删除缺失值
2)替换缺失值
- 代码示例:
np.genfromtxt(r"C:\Users\pc\Desktop\a.txt",delimiter=',')
结果: