python之numpy入门教程
前言
时间一晃而过,近来只顾玩耍,好久没有更新博客,今天终于想起来要做点事情了,所以今天就写一下numpy的入门教程。小菜也是刚开始学,还望多多指点。
- array结构
import numpy as np
A = np.array([1,2,3,4,5])
print(A) #输出 [1 2 3 4 5]
A2 = A + 1
print(A2) #,所有数都会加1,输出 [2 3 4 5 6]
A3 = A*A2
print(A3) #相当于两个数组对应数相乘,也可以理解为线性代数中两个矩阵相乘输出 [2 6 12 20 30]
print(A[0]) #输出第一个数 1
print(A.shape) #输出数组的维度,输出为(5,)
A4 = np.array([[1,2,3],[4,5,6]])
print(A4) #二维数组,输出为[[1 2 3]
#[4 5 6]]
A_list = [1,2,3,4,5]
A_array = np.array(A_list)
print(A_array) #输出[1 2 3 4 5]
print(type(A_array)) #A_array的类型,输出是为<class 'numpy.ndarray'>
print(A_array.dtype) #A-array的数据类型,输出为int32
#注 对于ndarry结构来说,里面的所有元素必须是同一类型的,如果不是,会向下自动转换
- 数值计算
import numpy as np
A_array = np.array([[1,2,3],[4,5,6]])
print(A_array) #输出为:[[1 2 3]
# [4 5 6]]
print(np.sum(A_array)) #将数组当中的所有数进行累加,输出为21
#指定要进行的操作沿什么轴
print(np.sum(A_array,axis=0)) #沿竖轴进行累加,输出为:[5 7 9]
print(A_array.ndim) #输出数据的维度,ndim返回的是一个数,输出为 2
print(np.sum(A_array,axis=1)) #沿横轴进行累加,输出为[6 15]
print(A_array.prod()) #数组中所有数进行连乘,输出为 120
print(A_array.prod(axis=0)) #沿竖轴进行连乘,输出为:[ 4 10 18]
print(A_array.prod(axis=1)) #沿横轴进行连乘,输出为:[ 6 120]
print(A_array.min()) #输出数组中的最小值,输出为:1
print(A_array.min(axis=0)) #沿竖轴依次得到最小值,输出为:[1 2 3]
print(A_array.min(axis=1)) #沿横轴依次得到最小值,输出为:[1 4]
print(A_array.max()) #输出数组中的最大值,输出为:6
#找到索引位置
print(A_array.argmin()) #最小值的索引位置,输出为:0
print(A_array.argmin(axis=0)) #沿竖轴依次得到最小值的索引位置,输出为:[0 0 0]
print(A_array.argmax(axis=1)) #沿横轴依次得到最大值的索引位置,输出为:[2 2]
print(A_array.argmax()) #数组中最大值的索引位置,输出为:5
print(A_array.mean()) #数组的平均值,输出为:3.5
print(A_array.mean(axis=0)) #沿竖轴依次得到的数组的平均值,输出为:[2.5 3.5 4.5]
#标准差 标准差(Standard Deviation) ,是离均差平方的算术平均数的算术平方根,用σ表示。
print(A_array.std()) #输出为:1.707825127659933
print(A_array.std(axis=1)) #对横轴计算标准差,输出为:[0.81649658 0.81649658]
#方差的计算 方差用来计算每一个变量(观察值)与总体均数之间的差异。
print(A_array.var()) #输出为:2.9166666666666665
#clip函数clip这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min。
print(A_array.clip(2,4)) #输出为:[[2 2 3]
# [4 4 4]]
A_array = np.array([1.2,3.56,6.41])
print(A_array.round()) #相当于四舍五入,输出为:[1. 4. 6.]
print(A_array.round(decimals=1)) #保留一位小数点,输出为:[1.2 3.6 6.4]
3.排序
import numpy as np
A_array = np.array([[1.5,1.3,7.5],[5.6,7.8,1.2]])
print(A_array) #输出为:[[1.5 1.3 7.5]
# [5.6 7.8 1.2]]
print(np.sort(A_array)) #将数组进行排序,输出为:[[1.3 1.5 7.5]
# [1.2 5.6 7.8]]
print(np.sort(A_array,axis=0))# 对竖轴进行排序,输出为:[[1.5 1.3 1.2]
# [5.6 7.8 7.5]]
#argsort()函数返回的是数组值从小到大的索引值。
print(np.argsort(A_array)) #输出为:[[1 0 2]
# [2 0 1]]
A_array = np.linspace(0,10,10) #在0-10之家随机产生十个数。
print(A_array)
'''
输出为:[0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556
6.66666667 7.77777778 8.88888889 10. ]
'''
A_array = np.array([[1,0,6],
[1,7,0],
[2,3,1],
[2,4,0]])
print(A_array)
'''
输出为:
[[1 0 6]
[1 7 0]
[2 3 1]
[2 4 0]]
'''
- 数组形状
import numpy as np
A_array = np.arange(10)
print(A_array) #输出为:[0 1 2 3 4 5 6 7 8 9]
print(A_array.shape) #输出数据维度,输出为:(10,)
A_array.shape = 2,5 #重新定义数组维度
print(A_array) #输出为:[[0 1 2 3 4]
# [5 6 7 8 9]]
print(A_array.reshape(1,10)) #,更改数据维度,输出为:[[0 1 2 3 4 5 6 7 8 9]]
A_array = np.arange(10)
print(A_array.shape) #输出为:(10,)
A_array = A_array[np.newaxis,:] #np.newaxis 在使用和功能上等价于 None,其实就是 None 的一个别名。
print(A_array) #输出为:[[0 1 2 3 4 5 6 7 8 9]]
A_array = A_array[:,np.newaxis]
print(A_array) #输出为:[[[0 1 2 3 4 5 6 7 8 9]]]
A_array = A_array.squeeze() #squeeze 函数:从数组的形状中删除单维度条目,即把shape中为1的维度去掉
print(A_array.shape) #输出为:(10,)
A_array.shape = 2,5
print(A_array) #输出为:[[0 1 2 3 4]
# [5 6 7 8 9]]
print(A_array.T) #转置
'''
输出为:[[0 5]
[1 6]
[2 7]
[3 8]
[4 9]]'''
#数组的连接
a = np.array([[123,456,678],[3214,456,134]])
print(a) #输出为:[[ 123 456 678]
# [3214 456 134]]
b = np.array([[1235,3214,432],[43,13,134]])
print(b) #输出为:[[1235 3214 432]
# [ 43 13 134]]
c = np.concatenate((a,b)) #可理解为上下相连
print(c)
'''
输出为:
[[ 123 456 678]
[3214 456 134]
[1235 3214 432]
[ 43 13 134]]
'''
c = np.concatenate((a,b),axis=0) #竖连
print(c)
'''
输出为:
[[ 123 456 678]
[3214 456 134]
[1235 3214 432]
[ 43 13 134]]
'''
c = np.concatenate((a,b),axis=1) #横连
print(c)
'''
输出为:
[[ 123 456 678 1235 3214 432]
[3214 456 134 43 13 134]]
'''
print(c.shape) #输出为:(2, 6)
print(np.vstack((a,b))) #相等于竖连
'''
输出为:
[[ 123 456 678]
[3214 456 134]
[1235 3214 432]
[ 43 13 134]]
'''
print(np.hstack((a,b))) #相当于横连
'''
输出为:
[[ 123 456 678 1235 3214 432]
[3214 456 134 43 13 134]]
'''
print(a) #输出a数组
'''
输出为:
[[ 123 456 678]
[3214 456 134]]
'''
print(a.flatten()) #这个相当于压平,压成只有一行
'''
输出为:[ 123 456 678 3214 456 134]
'''
5.数组生成
import numpy as np
print(np.array([1,2,3])) #输出[1 2 3]
#构造出来一个数组
print(np.arange(10)) #输出为:[0 1 2 3 4 5 6 7 8 9]
print(np.arange(2,20,2)) #输出为:[ 2 4 6 8 10 12 14 16 18]
print(np.arange(2,20,2,dtype=np.float32)) #输出为:[ 2. 4. 6. 8. 10. 12. 14. 16. 18.]
#默认是10为底的,开始点和结束点是10的幂
print(np.logspace(0,1,5)) #[ 1. 1.77827941 3.16227766 5.62341325 10. ]
x = np.linspace(-10,10,5)
print(x) #输出为:[-10. -5. 0. 5. 10.]
y = np.linspace(-10,10,5)
print(y) #输出为:[-10. -5. 0. 5. 10.]
#更常用的zeros ones,零矩阵,1矩阵
print(np.zeros(3)) #输出为:[0. 0. 0.]
print(np.zeros((3,3)))
'''
输出为:
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
'''
print(np.ones((3,3)))
'''
输出为:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
'''
print(np.ones((3,3),dtype=np.float32))
'''
输出为:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
'''
a = np.empty(6)
print(a.shape) #输出为:(6,)
print(a)
'''
输出为:[4.45032173e-308 7.56599807e-307 9.34605037e-307 2.33638188e-307
1.33511562e-306 1.37959129e-306]'''
a.fill(1) #用1填充
print(a) #输出为:[1. 1. 1. 1. 1. 1.]
A_array = np.array([1,2,3,4])
print(A_array) #输出为:[1 2 3 4]
print(np.zeros_like(A_array)) #输出为:[0 0 0 0]
print(np.ones_like(A_array)) #输出为:[1 1 1 1]
print(np.identity(5)) #初等矩阵
'''
输出为:
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
'''
6.运算
import numpy as np
x = np.array([5,5])
y = np.array([2,2])
z = np.multiply(x,y) #矩阵相乘
print(z) #输出为:[10 10]
#一维的时候是内积运算
print(np.dot(x,y)) #输出为:20
print(x.shape) #输出为:(2,)
print(y.shape) #输出为:(2,)
x.shape = 2,1 #改变维度
print(x)
'''
输出为:
[[5]
[5]]
'''
y.shape = 1,2
print(y) #输出为:[[2 2]]
#二维的时候就是矩阵运算
print(x.shape) #输出为:(2, 1)
print(y.shape) #输出为:(1, 2)
print(np.dot(x,y))
'''
输出为:
[[10 10]
[10 10]]
'''
print(np.dot(y,x)) #输出为:[[20]]
x = np.array([1,1,1])
y = np.array([[1,2,3],[4,5,6]])
print(x*y)
'''
输出为:
[[1 2 3]
[4 5 6]]
'''
x = np.array([1,1,1,4])
y = np.array([1,1,1,2])
print(x == y) #输出为:[ True True True False]
print(np.logical_and(x,y)) #逻辑与:输出为:[ True True True True]
print(np.logical_or(x,y)) #逻辑或,输出为:[ True True True True]
print(np.logical_not(x,y)) #逻辑非,输出为:[0 0 0 0]
7.随机模块
import numpy as np
print(np.random.rand(3,2)) #随机产生三行两列的数组
'''
输出为:
[[0.87465244 0.0233479 ]
[0.78814546 0.68005351]
[0.69842302 0.79313718]]
'''
print(np.random.randint(10,size=(5,4))) #生成五行四列的整数数组,且最大值不超过10
'''
输出为:
[[5 4 0 4]
[8 0 8 4]
[5 4 8 2]
[6 4 3 1]
[0 7 0 0]]
'''
print(np.random.rand()) #随机产生一个数,输出为:0.27569349234690677
print(np.random.random_sample()) #随机产生一个数,输出为:0.5537785049328294
print(np.random.randint(0,10,3)) #随机产生三个数,范围为0-10,输出为:[7 0 7]
mu,sigma = 0,0.1
print(np.random.normal(mu,sigma,10)) #生成高斯分布的概率密度随机数
'''
输出为:
[ 0.01216144 -0.09703099 0.07929835 -0.13699182 -0.06279411 0.00292478
-0.02031631 0.16823106 -0.05076774 -0.08562122]
'''
np.set_printoptions(precision=2) #设置精度为2
int(np.random.normal(mu,sigma,10))
'''
输出为:
[-0.03 -0.11 0.05 -0.05 0.2 -0.06 0.03 0.08 -0.15 0.02]
'''
8.读写
import numpy as np
f = open('A.txt','w') #打开文件,'w'表示写
f.write('1 2 3 4 5') #写进数字
f.write('\n') #回车换行
f.write('6 7 8 9 10')
f.close()#文件关闭,打开一个文件记得一定要关闭,这样一个文件就写好了
data = []
with open('A.txt') as f:
for line in f.readlines(): #逐行读文件
fileds = line.split() #切割符
cur_data = [float(x) for x in fileds] #将整数转化为浮点数
data.append(cur_data) #加入到data列表中
data = np.array(data) #转化为数组
print(data)
'''
输出为:
[[ 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10.]]
'''
data = np.loadtxt('A.txt')#读取数据
print(data)
'''
输出为:
[[ 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10.]]
'''
data = np.loadtxt('A.txt',delimiter=' ') #指定读取文件中数据的分割符
print(data)
'''
输出为:
[[ 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10.]]
'''
data = np.loadtxt('A.txt',delimiter=' ',skiprows=1)
print(data)
'''
输出为:
[ 6. 7. 8. 9. 10.]
'''
#skiprows:去掉几行
#delimiter=',':分割符
#usecols=(0,1,4):指定使用那几列
A_array = np.array([[1,2,3],[4,5,6]])
np.savetxt('A2.txt',A_array) #保存数据
np.savetxt('A2.txt',A_array,fmt='%d') #保存数据为整数
np.savetxt('tang2.txt',A_array,fmt='%d',delimiter=',')#分割符为','
np.savetxt('tang2.txt',A_array,fmt='%.2f',delimiter=',')#保留两位小数
#读写array结构
A_array = np.array([[1,2,3],[4,5,6]])
np.save('A_array.npy',tang_array)
A= np.load('A_array.npy') #获取数据
print(A)#[[1 2 3]
# [4 5 6]]
A_array2 = np.arange(10)
print(A_array2)#输出为:[0 1 2 3 4 5 6 7 8 9]
np.savez('A.npz',a = A_array,b = A_array2)
data = np.load('A.npz')
print(data['a']) #输出为:[[1 2 3]
# [4 5 6]]
print(data['b']) #输出为:[0 1 2 3 4 5 6 7 8 9]