目录
一、创建数组的方法
二、array的属性
三、创建特殊的数组
四、数组的变换
4.1、数组重塑
4.2、数组合并
4.3、数组分割
4.4、数组转置和轴对换
五、数组的索引和切片
5.1、一维数组的索引
5.2、多维数组的索引
5.3、多维数组的访问
六、数组的运算
6.1、数组的四则运算
6.2、ufunc 函数
七、数组读写
7.1、读写二进制文件
7.2、读写文本文件
7.3、读写csv文件
八、NumPy中的数据统计与分析
8.1、排序
8.2、重复数据与去重
8.3、常用统计函数
九、delete 函数
学习笔记: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))
结果:
二、array的属性
- shape : 数组的维度, 通俗的讲就是n行m列,则返回(n,m)的一个tuple,对于shape有 len(shape) = ndim。
- ndim: 数组的轴(维数)的个数,python里面,维度的数量称之为秩(区别于线性代数里面的)
- size: 返回一个数字,表示array中所有数据元素的数目
- dtype: 返回 array 中元素的数据类型
例子:
a = np.array(range(1,5),dtype='int64')
print(a.shape)
print(len(a.shape))
print(a.ndim)
print(a.size)
print(a.dtype)
结果:
三、创建特殊的数组
- np.ones(): 元素全为 1
- np.zeros(): 元素全为 0
- np.full(): 传入指定的元素
- np.diag(): 创建对角矩阵
- np.linspace(): 等差
- np.logspace(): 等比
例子:
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)
结果:
四、数组的变换
4.1、数组重塑
对于定义好的数组,可以通过 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
两者的
共同点:都是将 多维 数组降维为 一维;
不同点: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)
结果:
4.2、数组合并
数组合并用于多个数组键的操作,NumPy 使用 hstack、vstack 和 concatenate 函数完成数组的合并。
- hstack: 横向合并
- vstack: 纵向合并
- concatenate:指定方向合并 axis = 1 横向 , 0 纵向
例子:
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)
结果:
4.3、数组分割
与数组合并向反,NumPy 提供了 hsplit、vsplit 和 split 分别实现数组的横向、纵向和指定方向的分割。
- hsplit 横向分割
- vsplit 纵向分割
- split 指定方向分割 axis = 1 横向 , 0 纵向
例子:
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)
结果:
4.4、数组转置和轴对换
数组转置是数组重塑的一种特殊形式,可以通过 transpose 方法进行装置。transpose 方法需要传入轴编号组成的元组。
需要注意的是:无论是数组的转置还是轴对换,返回的都是源数据的视图,对返回的数组操作都会改变原数组。
- 数组的转置 ==> 将矩阵的 行 变成 列
- 数组的 transpose(1,0)
- 数组的 T 属性
例子:下面是针对二维的转置,还有三维的,遇到再记录。
# 数组的转置
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)
结果:
- 数组的轴对换 ==> 将矩阵的 列 变成 行
- 数组的 swapaxex
例子:
# 数组的轴对换
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)
结果:
五、数组的索引和切片
5.1、一维数组的索引
一维数组的索类似于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)
结果:
5.2、多维数组的索引
多于多维数组,它的每一个维度都有一个索引,各个维度的索引之间用逗号分隔。
- 多维数组的索引
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:,:]) # 最后一行元素
结果:
5.3、多维数组的访问
例子:
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))
结果:
6.1、数组的四则运算
例子:
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 函数。
6.2、ufunc 函数
ufunc 函数全称为通用函数,是一种能够对数组中的所有元素进行操作的函数。ufunc 函数的广播机制是指不同形状的数组之间执行算术运算的方式。
广播机制需要遵循4个原则:
- 让所有输入数组都向其中 shape 最长的数组看齐,shape 中不足的部分都通过在前面加 1 补齐。
- 输出数组的 shape 是输入数组 shape 的各个轴上的最大值。
- 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错。
- 当输入数组的某个轴的长度为 1 时,沿着此轴运算时都用此轴上的第一组值。
读完上面的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博客
七、数组读写
7.1、读写二进制文件
- 读
- load()
- 写
-
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)
7.2、读写文本文件
- loadtxt()
- savetxt()
- genfromtxt() 参数 delimiter 数据以什么分隔
7.3、读写csv文件
- loadtxt(‘CSV文件名’)
八、NumPy中的数据统计与分析
8.1、排序
- 直接排序
- sort()
- axis = 1 表示 行 , 0 表示 列
- 一维中 不存在axis=1,只有axis=0
- 间接排序
- argsort
- lexsort
直接排序:
例子:对于一维数组排序,不管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 中的元素从小到大排序, 然后依次提取原数组的每个元素在新素组的下标位置,最后输出提取出来的下标组成一个索引数组。
8.2、重复数据与去重
- np.unique(去重数组)
- np.title(A,resp) ===> A 表示要重复的数组,resps表示重复次数
- np.repeat(a,resp,axis=0) ===> axis=0 按行重复
8.3、常用统计函数
- np.sum(arr) axis=1 行求和 ,0 列求和。none 所有元素求和。
- np.mean() # 均值
- np.var() # 方差
- np.std() # 标准差
- np.median() # 中位数 中值
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)) # 求标准差
九、delete 函数
np.delete(arr , [-1,-2], 0) # [-1,-2] axis = 0, 按行删除 删除第 -1 行 和 第 -2 行
或
np.delete(arr , 2, 0) # [-1,-2] axis = 0, 按行删除
Numpy还有很多很多实用的知识点,后面遇到再记录。
今天就到这里啦~~~
拜~~~