numpy-python的科学计算库

数值计算工具numpy

当数据量庞大时,list列表速度很慢,使用numpy扩展库完成数组操作。

基本对象为
ndarray:存储单一数据类型的多维数组(数据元素类型应一致,若不一致,会自动向下进行转换float,string)

ufunc:对数组进行处理的通用函数

1.数组的创建

a = np.array([1,2,3,4]) #单个列表创建一维数组
b = np.array(((1,1,1),(2,2,2),(3.,3,3)))  #嵌套元组创建二维数组
print(b)  #当输入元素含有整形与浮点型时,输出的数组元素都转换成浮点型
[[1. 1. 1.]
 [2. 2. 2.]
 [3. 3. 3.]]
# 使用arange,empty,linspace等函数生成数组
a = np.arange(4,dtype=float)  #创建浮点型数组[0.,1.,2.,3.]
b = np.arange(0,10,2,dtype=int)  #创建整型数组[0,2,4,6,8]
c = np.empty((2,3),int)   #创建2*3整形空矩阵
# empty函数只分配数组所用内存,不对数组元素初始化,运行速度最快
d = np.linspace(-1,2,5)  #创建数组[-1,-0.25,0.5,1.25,2.]
e = np.random.randint(0,3,(2,3))  #生成[0,3)上的2行3列的随机整型数组

2.数组的属性

  • ndim 返回int数组的维数
  • shape 返回元组,数组的尺寸 shape可以返回矩阵维度,相比于list更方便
  • size 返回int,数组的元素总数,即shape中所有元素的乘积
  • dtype 返回数据类型
  • itemsize 返回int,每个元素的大小
a = np.random.randint(1,101,(3,5))   #生成1-100间的3行5列的随机整数数组
print("维数ndim=",a.ndim)
print("维度shape=",a.shape)
print("元素总数size=",a.size)
print("类型dtype=",a.dtype)
print("每个元素字节数itemsize=",a.itemsize)
维数ndim= 2
维度shape= (3, 5)
元素总数size= 15
类型dtype= int32
每个元素字节数itemsize= 4

3.数组元素的索引

  • 1.切片操作与列表相同[start:end,step]
  • 2.列表元素引用为a[i][j],array元素引用为a[i,j],a[0:2,1:4]
# 布尔索引
a = np.array([[1,np.nan,2],[4,np.nan,0]])
b = a[~np.isnan(a)]      #提取a中非nan的数
print("b中大于1的有",b[b>1])
b中大于1的有 [2. 4.]
# 花式索引
# 一维数组的索引结果是对应位置元素
a = np.array([1,2,3,4,5])
a[[1,3]] 

# 二维数组的索引结果是对应下标的行
a = np.array([[1,1],[2,2],[3,3],[4,4]])
a[[0,2]]
array([[1, 1],
       [3, 3]])

4.数组的修改

数组元素的修改 数组维数的扩大或缩小

# 数组元素的修改
x = np.array([[0,0,0],[1,1,1],[2,2,2]])
x[0,1] = -1   #修改第一行第二个元素为-1

#删除行/列
y = np.delete(x,0,axis=0)   #删除数组的第0行
print(y)
z = np.delete(x,2,axis=1)   #删除数组的第3列
print(z)

#增加行/列
h = np.append(x,[[3,3,3]],axis=0)   #增加一行
print(h)
l = np.append(x,[[0],[1],[2]],axis=1)   #增加一列
print(l)
[[1 1 1]
 [2 2 2]]
[[ 0 -1]
 [ 1  1]
 [ 2  2]]
[[ 0 -1  0]
 [ 1  1  1]
 [ 2  2  2]
 [ 3  3  3]]
[[ 0 -1  0  0]
 [ 1  1  1  1]
 [ 2  2  2  2]]

5.数组变形

使用reshape函数改变数组的维度,指定数组在每个维度上的大小,同时不改变原始数据的值。若指定维度与size不吻合则抛出异常

a = np.arange(8)
#reshape不改变原数组,返回视图
print(a,'变形后:\n',a.reshape(2,4))

# resize将原数组改变,没有返回值
print(a.resize(4,2),'变形后:\n',a)
[0 1 2 3 4 5 6 7] 变形后:
 [[0 1 2 3]
 [4 5 6 7]]
None 变形后:
 [[0 1]
 [2 3]
 [4 5]
 [6 7]]

6. 数组的运算

  • 1.四则运算:对应元素±*/ % // **运算
  • 2.比较运算
  • 3.ufunc通用函数:对数组中的元素逐个操作的函数,包括指数函数幂函数三角运算等等
    numpy运算函数 np.sin(),np.cos(),np.power()
# 1.简单四则运算
a = np.arange(1,10)
b = np.arange(11,20)
print(b*a)   #对应元素相乘

# 整除的函数可以返回小数部分与整数部分
print(np.modf(b/a)[0])    #对应元素相除的小数部分
print(np.modf(a/b)[1])    #对应元素相除的整数部分
[ 11  24  39  56  75  96 119 144 171]
[0.         0.         0.33333333 0.5        0.         0.66666667
 0.42857143 0.25       0.11111111]
[0. 0. 0. 0. 0. 0. 0. 0. 0.]
# 2.比较运算
a = np.random.randint(0,10,(10,))
b = np.random.randint(5,10,(10,))

print(a[a>=b])   #取出a中 a>=b的所有元素
print(a[a>7])     #取出a中 a>5的所有元素
print(np.where(a>5,-1,a))     #将a中大于5的元素改为-1
print(np.where(a>5,1,0))       #将a中大于5的元素改为1,否则为0
[8 5 6 8 9 6]
[8 8 9]
[-1  2  5  4 -1  5 -1 -1  2 -1]
[1 0 0 0 1 0 1 1 0 1]
# 3.ufunc函数的广播机制
a = np.arange(0,20,10).reshape(-1,1)
print(a)
b = np.arange(0,3)
print(b)
print(a+b)
[[ 0]
 [10]]
[0 1 2]
[[ 0  1  2]
 [10 11 12]]
# numpy运算函数
np.sqrt  #开平方
np.sum
np.square?
np.power?
np.arccos?
np.cos(np.pi/2)

7.文件存取

存取格式:

  • 二进制文件:tofile,fromfile / load,save,savez
  • 文本文件:savetxt,loadtxt
    若处理复杂数据结构,如缺失数据,可以用genfromtxt函数
# 1. 文本文件的存取
a = np.random.uniform(0,6,6).reshape(2,3)   #生成2*3的均匀数组
#写存 savetxt("文件名",数组)
np.savetxt("D:/ndarray_data.txt",a,fmt="%d",delimiter=",")   #保存为整数,以,分隔 

#读取 loadtxt("文件名")
b = np.loadtxt("D:/ndarray_data.txt",delimiter=",")   #读取也以,分隔
print(b)
[[4. 3. 0.]
 [0. 0. 3.]]
# 2. 二进制文件存取
a = np.arange(6).reshape(2,3)
# tofile("文件名")输出的数据不保存数组形状和元素类型
a.tofile("D:/ndarray_data.txt")

# fromfile()读数据时需要指定元素类型,并对数组形状修改
b = np.fromfile("D:/ndarray_data.txt",dtype=int).reshape(2,3)
print(b)
[[0 1 2]
 [3 4 5]]

你可能感兴趣的:(python,python,矩阵,numpy)