
目录
学习笔记:NumPy 基础知识
常见如以下:
np.array([1,2,3])
np.array(arange(1,4))
np.arange(1,4) 常用
array: 将输入的数据(可以是列表、元组、数组及其他序列) 转换为 ndarray (Numpy数组)
arange : Python内建函数 range 的数组版
例子:
- import numpy as np
- a = np.array([1,2,3,4])
- b = np.array(range(1,5))
- c = np.arange(1,5,dtype="float32") # 常用
- d = np.arange(0,1,0.01)
- print(a)
- print(b)
- print(c)
-
- print(type(a),type(b),type(c))
结果:

例子:
- a = np.array(range(1,5),dtype='int64')
-
- print(a.shape)
- print(len(a.shape))
- print(a.ndim)
- print(a.size)
- print(a.dtype)
结果:

例子:
- a = np.ones((2,3))
- b = np.zeros((2,3))
- c = np.full(3,520)
- d = np.full((1,3),520)
- e = np.diag((1,2,3,4,5))
-
- f = np.linspace(0,1,5) # 等差
- j = np.logspace(0,0,10) # 等比 开始点和结束点是10的幂,0代表10的0次方,9代表10的9次方。
- h = np.logspace(0,1,5) # 底数默认为 10
-
- print('元素全为1:\n',a)
- print('元素全为0:\n',b)
- print('传入指定的元素:\n',c)
- print('传入指定的元素:\n',d)
- print('对角矩阵:\n',e)
-
- print(f)
- print(j)
- print(h)
结果:

对于定义好的数组,可以通过 reshape() 方法改变其数组的维度,传入的参数为新维度的元组。
需要注意的是:数据重塑不会改变原来的数组。对于 reshape() 中的参数设置为 -1 ,表示数组的维度可通过数据本身来推断。
例子:
- a = np.arange(8) # 等差数组
- b = a.reshape((2,4)) # 2 行4列 reshape 未改原数组 应满足: 2 x 4 = 8
- c = a.reshape(4,-1)
-
- print(a)
- print(b)
- print(a)
- print('========')
- print(c)
结果:

与 reshape() 方法相反的是
两者的
共同点:都是将 多维 数组降维为 一维;
不同点:flatten 是返回一份拷贝,对拷贝所做的修改不会影响 原始数组的值;ravel 是返回视图,对返回的修改,会影响 原始数组。
例子:
- # 与reshape() 方法相反的是 数据散开 ravel 或数据扁平化 flatten
- a = np.array([
- [1,2,3],
- [4,5,6],
- ])
- b = a.flatten()
- c = a.ravel()
-
- print(b)
- b[1] = 2222
- print(a)
- print('============')
- print(c)
- c[1] = 666
- print(a)
结果:

数组合并用于多个数组键的操作,NumPy 使用 hstack、vstack 和 concatenate 函数完成数组的合并。
例子:
- arr1 = np.arange(6).reshape(3,-1)
- arr2 = arr1 * 2
-
- print(arr1)
- print('======')
- print(arr2)
-
- print('===合并====')
- a = np.hstack((arr1,arr2))
- print('横向合并 hstack: \n',a)
-
- b = np.vstack((arr1,arr2))
- print('纵向合并 cvstack: \n',b)
-
- c = np.concatenate((arr1,arr2),axis = 1) # axis = 1 横向
- print(c)
结果:

与数组合并向反,NumPy 提供了 hsplit、vsplit 和 split 分别实现数组的横向、纵向和指定方向的分割。
例子:
- arr1 = np.arange(16).reshape(4,4)
-
- print(arr1)
- print('=======================')
- a = np.hsplit(arr1,2) # 要求等分 能够被除尽
- print(a)
- print(a[0])
- print('=======================')
- b = np.vsplit(arr1,2)
- print(b)
- print(b[0])
- print('=======================')
- c = np.split(arr1,indices_or_sections=2,axis=1)
- print(c)
结果:

数组转置是数组重塑的一种特殊形式,可以通过 transpose 方法进行装置。transpose 方法需要传入轴编号组成的元组。
需要注意的是:无论是数组的转置还是轴对换,返回的都是源数据的视图,对返回的数组操作都会改变原数组。
例子:下面是针对二维的转置,还有三维的,遇到再记录。
- # 数组的转置
- arr = np.arange(6).reshape(3,2)
- print('矩阵:\n',arr)
- z_arr = arr.transpose((1,0))
- # transpose(X,Y)X轴用0表示,Y轴用1表示 对应:行,列
- # (1,0) 表示行与列调换了位置;因为 1 是行 0 是列
- print('转置矩阵:\n',z_arr) # 转置矩阵: 将矩阵的行列互换得到的新矩阵称为转置矩阵
- print(arr.T)
结果:

例子:
- # 数组的轴对换
- arr = np.arange(6).reshape(3,2)
-
- print(arr)
- print('==========')
- a = arr.swapaxes(0,1)
- # 对返回的数组进行操作
- a[0] = [1,2,3]
-
- print(a)
- print('原数组变成了:\n',arr)
结果:

一维数组的索类似于Python 中的列表。
需要注意的是:数组的切片返回的是视图,如对返回的数组进行操作,会改变原数组。
这就有了数组元素的复制:切片数组.copy()
例子:
- arr = np.arange(10)
-
- print(arr)
-
- print(arr[0])
- print(arr[-1])
- print(arr[0:3])
-
- # 数组元素的复制
- arr1 = arr[2:-1].copy()
- print('复制出来的元素:',arr1)
结果:

多于多维数组,它的每一个维度都有一个索引,各个维度的索引之间用逗号分隔。
- arr = np.arange(12).reshape(3,-1)
-
- print(arr)
- print('=============')
-
- print(arr[0,1:3]) # 第 0 行中 第 1 列到第 2 列的元素
- print(arr[:,2]) # 第 2 列元素
-
- print(arr[:1,:1]) # 第 0 行 第0 列元素
- print(arr[-1:,:]) # 最后一行元素
结果:

例子:
- arr = np.arange(12).reshape(3,4)
-
- print(arr)
- print('=============')
-
- print(arr[0][0])
- print(arr[(0,1),(1,3)])
结果:

数组不需要通过循环就可以完成批量计算。
例子:计算数组 a 与数组 b 相加,数组 a是 1 ~ n 数字的立方,数组 b 是1 ~ n 的数字平方
- # 数组 a 与数组 b 相加,数组 a是 1 ~ n 数字的立方,数组 b 是1 ~ n 的数字平方
- import numpy as np
-
- def sum(n):
- a = np.arange(1,n+1)**3
- b = np.arange(1,n+1)**2
- return a+b
- print(sum(3))
结果:

例子:
- x = np.array([2,4,6])
- y = np.array([1,2,3])
-
- print(x + y)
- print(x - y)
- print(x * y)
- print(x ** y)
- print(x / y)
结果:

在上面的例子中,可以看出:数组间的四则运算是对每个数组中的元素分别进行四则运算,这就要求了计算的数组的形状必须相同。不同形状之间的数组运算就会报错,对于此,我们可以使用 ufunc 函数。
ufunc 函数全称为通用函数,是一种能够对数组中的所有元素进行操作的函数。ufunc 函数的广播机制是指不同形状的数组之间执行算术运算的方式。
广播机制需要遵循4个原则:
读完上面的4个原则,感觉很难理解的话,我们来看下面的例子就会好很多:
例子:
- arr1 = np.array([
- [0,0,0],
- [1,1,1],
- [2,2,2],
- ])
- arr2 = np.array([1,2,3])
- arr3 = np.array([[1],[2],[2]])
-
- print(arr1)
- print('=========')
- print(arr2)
- print('=========')
- print(arr3)
- print('=========')
-
- print('广播 X轴长度为1 向下沿用\n',arr1 + arr2)
- print('--------------')
- print('广播 y轴长度为1 向右沿用\n',arr1 + arr3)
结果:

更详细的可以看看这位博主的:很不错
ufunc函数常用运算、ufunc函数广播机制——《Python数据分析与应用》笔记_Linesoso的博客-CSDN博客
save('文件名.npy',arr)
savez('文件名.npz',arr) 多个数组的保存
例子:
- a = np.arange(1,13).reshape(3,4)
- np.save('arr.npy',a)
- c = np.load('arr.npy')
- c
结果:


上面是直接保存和读取当前文件下的。我们也可以自定义路径
np.save(r'D:\桌面\arr.npy',a)
直接排序:
例子:对于一维数组排序,不管axis即可。
- arr = np.array([7,8,9,1,2,3,4,4,4,5,6])
-
- new = np.sort(arr,axis=0) # 是一维数据,只有一个维度,也就是axis=0,不存在axis=1
- print(new)
结果:

二维数组:
- arr = np.array([
- [4,3,2],
- [5,2,1],
- [1,7,2]
- ])
-
- x = np.sort(arr,axis=1) # 行向排序 小到大
- y = np.sort(arr,axis=0) # 列向排序
- print('行向排序:\n',x)
- print('列向排序:\n',y)
结果:

间接排序:
对于 argsort:
返回的值为排序后的下标数组。
例子:
- arr = np.array([5,4,3,2,1])
-
- print('原数组:\n',arr)
- print('========')
- b = np.argsort(arr)
- print('排序后:\n',b)
结果:

对于上面的代码我们不难看出:先将 arr 中的元素从小到大排序, 然后依次提取原数组的每个元素在新素组的下标位置,最后输出提取出来的下标组成一个索引数组。

- print(x.sum(axis=0)) # 求和,axis:0是列求和,1是行求和,None是所有数求和
- print(np.mean(x, axis=0)) # 求平均数
- print(np.median(x, axis=0)) # 求中值
- print(x.max(axis=0)) # 求最大值
- print(x.min(axis=0)) # 求最小值
- print(np.ptp(x, axis=0)) # 求极值(最大最小值的差)
- print(x.std(axis=0)) # 求标准差
np.delete(arr , [-1,-2], 0) # [-1,-2] axis = 0, 按行删除 删除第 -1 行 和 第 -2 行
或
np.delete(arr , 2, 0) # [-1,-2] axis = 0, 按行删除
Numpy还有很多很多实用的知识点,后面遇到再记录。
今天就到这里啦~~~
拜~~~
