目录
numpy的基本对象为ndarray,即n-dimensional array object,它是存储单一数据类型的多维数组
一、numpy数组的创建
1.1 手动创建
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array(list((1,2,3,4,5,6,7,8,9)))
1.2 调用numpy函数创建
# 创建2行3列的全一矩阵
c = np.ones((2,3))
# 创建2行3列的全0矩阵
d = np.zeros((2,3))
# 创建4行4列的单位矩阵
e = np.eye(4)
还有产生随机数的一系列方法都在np.random里面
1.3 创建连续数组
# 类似于list,起始位置为1,结束位置为10,步长为2
f = np.arange(1,10,2)
# 起始位置为1,结束位置为10,创建20个数据,数据是等差数列
g = np.linspace(1,10,20)
# 起始位置为1,结束位置为10,创建20个数据,数据为等比数列、
h = np.logspace(1,10,20)
二、numpy数据类型以及本身操作
2.1 numpy的数据类型及转换
numpy数组创建的时候,可以通过dtype制定数据类型,numpy常见的数据类型如下:
# 创建数组的时候制定数据类型为int32
a = np.eye(5,dtype=np.int32)
# 查看数据类型,结果为dtype('int32')
a.dtype
# 转化数据类型,转化成np.float32
a.astype(np.float32)
2.2 numpy数组的shape即转换
# 创建大小为(4,4)的数组
a = np.eye(4,dtype=np.int32)
# 显示a的shape,为(4,4)
a.shape
# 将a数组转化成(2,8)列的数组
a.reshape((2,8))
输出结果为:
三、取numpy数组中的值
3.1 切片索引
切片索引是源数据的视图,对切片进行修改,也会影响到源数据
a = np.arange(10)
a_slice = a[3:9]
#a_slice输出结果为array([3, 4, 5, 6, 7, 8])
# 将索引的0个元素赋值为12345,则a的相应的值也会发生改变
a_slice[0] = 12345
# 输出a的值为
array([ 0, 1, 2, 12345, 4, 5, 6, 7, 8, 9])
更为复杂的切片索引
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# arr2d为
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 取前两行,后两列的数据
arr2d[:2,1:]
# 取第二列的数据
arr2d[:,1]
3.2 布尔索引
通过布尔值来取相应的数据
# names为7个人名,分别对应data1的7行
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
# data数据如下
array([[ 0.41913264, -0.60298782, -0.33671674, 0.90943554],
[-0.80005614, 0.0440845 , -0.39836774, 0.70296011],
[-0.71155559, -1.55516028, 0.94330681, -1.16287966],
[ 0.71886886, -0.44805654, 0.20305883, -1.40290861],
[-0.55253099, 0.40979184, 0.38371407, 0.32289946],
[ 1.84004387, 0.35889294, 0.20075337, -1.07528119],
[ 0.35663761, -0.80927168, -1.57235542, -1.26338198]])
# 取Bob所对应的行
data[names == 'Bob']
结果:
array([[ 0.41913264, -0.60298782, -0.33671674, 0.90943554],
[ 0.71886886, -0.44805654, 0.20305883, -1.40290861]])
3.3 花式索引
利用整数数组来进行取值,想取那行就把那行的索引放在数组里
arr = np.ones((8, 4))
for i in range(8):
arr[i] = i
# arr数据
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
# 现在想取1,3,5,7行
arr[[1,3,5,7]]
结果:
array([[1., 1., 1., 1.],
[3., 3., 3., 3.],
[5., 5., 5., 5.],
[7., 7., 7., 7.]])
四、numpy数组的计算
4.1 numpy数组本身的计算
# 通过numpy数组对进行一些统计计算,如:numpy数组求和,求平均等等
# 生成3行2列的随机数组
arr = np.random.randn(3,2)
array([[-0.17504348, 1.07181866],
[ 0.98881592, -0.18443573],
[ 0.07177932, -1.13940987]])
# 对arr数组求均值
arr.mean()
结果:
0.10558747189372959
# 对arr数组求和
arr.sum()
结果:
0.6335248313623776
# 对arr数组列求和
arr.sum(axis=0)
结果:
array([ 0.88555177, -0.25202694])
# 对arr数组行求和
arr.sum(axis=1)
结果:
array([ 0.89677519, 0.80438019, -1.06763054])
# 对numpy数组进行一些数学运算,例如求指数,求平方
# 这些在numpy里叫ufunc即 universal function,对数组内每个元素进行操作的函数
arr = np.random.randn(6)
# 对arr求绝对值
np.abs(arr)
结果:
array([1.02469848, 0.84606635, 0.43296449, 0.86053481, 0.10749375, 1.49358338])
# 对arr求cos
np.cos(arr)
结果:
array([0.51935658, 0.6629333 , 0.90772595, 0.65203207, 0.99422811, 0.07713625])
4.2 与其他numpy数组的计算
# numpy与其他数组的计算,主要包括加、减、乘、除,求逆等等
# 常用的操作为矩阵相乘
a = np.array([[1,2],[3,4]])
b = np.array([[1,1],[2,2]])
a
array([[1, 2],
[3, 4]])
b
array([[1, 1],
[2, 2]])
# 矩阵相乘为np.dot(),py3.5以后也可以用@
np.dot(a,b) 或者 a@b
结果都一样,如下:
array([[ 5, 5],
[11, 11]])
# 矩阵对应元素与元素相乘
np.multiply(a,b)
结果:
array([[1, 2],
[6, 8]])
五、numpy数据的保存与加载
# numpy数据的保存
arr = np.arange(10)
np.save('test',arr)
# numpy数据的加载
b = np.load('test.npy')