numpy基本使用
目录
1.初始numpy
#列表的缺点
a=[1,2,3]
# a+1 报错
b=[i+1 for i in a]
print(b) #[2, 3, 4]
#想要列表完成a+b的运算操作
a=[1,2,3]
b=[2,3,4]
c=[x+y for (x,y) in zip(a,b)]
print(c) #[3, 5, 7]
#引入numpy计算
import numpy as np
a=np.array([1,2,3,4])
print(a+1) #[2 3 4 5]
列表在进行运算操作时是过于繁琐的,而用过numpy可以使运算更加方便快捷
2.产生数组
import numpy as np
#1.从列表产生数组
list1=[0,1,2,3]
a=np.array(list1)
print(a) #[0 1 2 3]
#2.生成全0数组
a=np.zeros(5)
print(a) #[0. 0. 0. 0. 0.]
#3.生成全1数组
a=np.ones(5,dtype='int')
print(a) #[1 1 1 1 1]
#4.可以使用fill方法将数组设为指定值
a=np.array([1,2,3,4,5])
print(a) #[1 2 3 4 5]
a.fill(5)
print(a) #[5 5 5 5 5]
#5.与列表不同,数组中要求所有元素的dtype是一样的,
#如果传入参数的类型和数组的类型不一样,需要按照已有的类型进行转换
a=np.array([1,2,3,4,5])
a.fill(2.8)
print(a) #向下取整 [2 2 2 2 2]
b=a.astype('float')
b.fill(2.8)
print(b) #[2.8 2.8 2.8 2.8 2.8]
#6.生成整数序列 左闭右开
a=np.arange(1,10)
print(a) #[1 2 3 4 5 6 7 8 9]
a=np.arange(1,10,2)
print(a) #[1 3 5 7 9]
#7.生成等差数列 左闭右闭
a=np.linspace(1,10,21) #第三个参数代表元素的个数
print(a)
#[ 1. 1.45 1.9 2.35 2.8 3.25 3.7 4.15 4.6 #5.05 5.5 5.95
# 6.4 6.85 7.3 7.75 8.2 8.65 9.1 9.55 10. ]
#8.生成随机数 返回一个0~1但不包括1的随机数
a=np.random.rand(10) #元素个数
print(a)
#[0.40468317 0.51145897 0.91864091 0.02519811 0.3705643 #0.07932932
#0.23581236 0.91098156 0.41299108 0.88353082]
a=np.random.randint(1,10,20) #(begin,end,个数)
print(a)
#[9 2 6 4 5 1 9 7 2 3 6 8 5 7 6 2 4 5 7 7]
3.数组属性
import numpy as np
a=np.random.rand(10)
#1.查看类型
print(type(a)) #<class 'numpy.ndarray'>
#2.查看数组中的数据类型
print(a.dtype) #float64
#3.查看形状,会返回一个元组,每个元素代表这一维的元素数目
print(a.shape) #(10,)
#4.查看数组里面元素的数目
print(a.size) #10
#5.查看数组的维度
print(a.ndim) #1
a.shape返回的是(10,)表示的是一个一维数组,这个一维数组有10个元素;二维数组返回的是(num1,num2)表示的是几行几列
4.索引与切片
import numpy as np
a=np.array([1,2,3,4,5,6])
#1.索引第一个元素
print(a[0]) #1
#2.修改第一个元素的值
a[0]=10
print(a) #[10 2 3 4 5 6]
a[0]=1
#切片 支持负索引
print(a[1:3]) #[2 3]
print(a[1:-2]) #[2 3 4]
5.实战演示
#问:一部电影的累计票房是21000,21800,22240,23450,25000
#求:每日电影票房
#解析:后一天的票房减去前一天的票房就是当日票房
import numpy as np
ob=np.array([21000,21800,22240,23450,25000])
ob2=ob[1:]-ob[:-1]
print(ob2) #[ 800 440 1210 1550]
6.多维数组及其属性
import numpy as np
#1.生成多维数组
a=np.array([[0,1,2,3],[10,11,12,13]]) #传入的是一个以列表为元素的列表
print(a)
#[[ 0 1 2 3]
# [10 11 12 13]]
#2.查看形状
print(a.shape)
# (2, 4)代表两行四列
#3.查看总的元素个数
print(a.size) #8
#4.查看维度
print(a.ndim) #2
7.多维数组索引
import numpy as np
a=np.array([[0,1,2,3],[10,11,12,13]])
#1.a[行索引,列索引]
print(a[1,3]) #13
#2.单个索引来索引一整行内容
print(a[1]) #[10 11 12 13]
#3.
print(a[:,1]) #[ 1 11]
8.多维数组切片
import numpy as np
a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],
[20,21,22,23,24,25],[30,31,32,33,34,35],
[40,41,42,43,44,45],[50,51,52,53,54,55]])
#每一维都支持切片的规则,包括负索引,省略:[lower:upper:step]
#1.得到第一行的第4和第5两个元素
print(a[0,3:5]) #[3 4]
#2.得到最后两行的最后两列
print(a[4:,4:])
#[[44 45]
# [54 55]]
#3.得到第三列
print(a[:,2]) #[ 2 12 22 32 42 52]
#4.取出第3行和第5行的奇数列(第1列,第3列,第5列)
print(a[2::2,::2])
#[[20 22 24]
# [40 42 44]]
9.切片实质
import numpy as np
'''
切片是引用
切片在内存中使用的是引用机制
'''
#1.
a=np.array([0,1,2,3,4])
b=a[2:4]
# print(b) #[2 3]
b[0]=10
# print(a) #原来的2变为了10
'''
① 引用机制意味着python并没有为b分配新的空间来存储它的值,而是让b
指向了a所分配的内存空间。因此改变b会改变a的值
② 列表当中是不会出现这种现象的
'''
#2.copy()
a=np.array([0,1,2,3,4])
b=a.copy()
b[0]=10
print(a) #[0 1 2 3 4]
print(b) #[10 1 2 3 4]