我是靠谱客的博主 爱笑草莓,最近开发中收集的这篇文章主要介绍Numpy_操作数组一.索引和切片二.改变数组结构三.合并四.拆分五.复制六.排序七.查找八.筛选九.数组I/O,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一.索引和切片
描述
- 索引是定位一维或多维数组中的单个或多个元素的行为模式
- 切片是返回一维或多维数组中单个或多个相邻元素的视图,目的是引用或赋值
实例
a = np.arange(9)
# 最后一个元素
a[-1]
# 返回第2到第5个元素
a[2:5]
# 返回第0到7个元素,步长为3
a[:7:3]
# 返回逆序的数组
a[::-1]
# 2层3行4列
a = np.arange(24).reshape(2, 3, 4)
# 虽然可以这样索引
a[1][2][3]
# 但这样才是规范的用法
a[1, 2, 3]
# 所有楼层的第0行第0列
a[:, 0, 0]
# 1层的所有房间,等价于a[0]或a[0, ....]
a[0, :, :]
# 所有楼层所有排的第1到第3列
a[:, :, 1:3]
# 2层每一行的最后一个房间
a[1, :, -1]
a = np.arange(12).reshape(3, 4)
# 数组b是数组a的切片
b = a[1:, 2:]
# 改变数组b的值,也会同时影响数组a
b[:, :] = 99
a
二.改变数组结构
描述
- ndarray.reshape():按照指定的结构(形状)返回数组的新视图,不改变原数组
- ndarray.ravel():返回多维数组一维化的视图,不改变原数组
- ndarray.transpose():返回行变列的视图,不改变原数组
- ndarray.resize():按照指定的结构(形状)改变原数组,无返回值
- numpy.rollaxis():翻滚轴,返回新的视图,不改变原有数组
实例
a = np.arange(12)
# reshape()函数返回数组a的一个新视图,但不会改变数组a
b = a.reshape((3, 4))
a.shape
b.shape
b is a
b.base is a
# resize()函数没有返回值,但真正的改变了数组a的结构
a.resize([4, 3])
a.shape
# 返回多维数组一维化的视图,但不会改变原数组
a.ravel()
a.shape
# 返回行变列的视图,等价于transpose()函数
a.T
# 翻滚轴, 1轴变0轴
np.rollaxis(a, 0, 1)
img = np.random.randint(0, 256, (600, 800, 3), dtype=np.uint8)
img.shape
# 将图像数据分离成RGB三个颜色通道
r, g, b = np.rollaxis(img, 2, 0)
r.shape, g.shape, b.shape
# 导入pillow模块的Image
from PIL import Image
# 显示随机生成的噪声图
Image.fromarray(img).show()
三.合并
描述
- append()函数:向数组内添加元素
- stack()函数:合并函数
- hstack():水平合并函数
- vstack():垂直合并函数
- dstack():深度合并函数
实例
np.append([[1, 2, 3]], [[4, 5, 6]])
np.append([[1, 2, 3]], [[4, 5, 6]], axis=0)
np.append([[1, 2, 3]], [[4, 5, 6]], axis=1)
a = np.arange(4).reshape(2, 2)
b = np.arange(4, 8).reshape(2, 2)
# 水平合并
np.hstack((a, b))
# 垂直合并
np.vstack((a, b))
# 深度合并
np.dstack((a, b))
a = np.arange(60).reshape(3, 4, 5)
b = np.arange(60).reshape(3, 4, 5)
a.shape, b.shape
np.stack((a, b), axis=0).shape
np.stack((a, b), axis=1).shape
np.stack((a, b), axis=2).shape
np.stack((a, b), axis=3).shape
四.拆分
描述
- np.hsplit():水平拆分
- np.vsplit():垂直拆分
- np.dsplit():深度方向拆分
实例
a = np.arange(16).reshape(2, 4, 2)
# 水平方向拆分成2部分
np.hsplit(a, 2)
# 垂直方向拆分成2部分
np.vsplit(a, 2)
# 深度方向拆分成2部分
np.dsplit(a, 2)
五.复制
描述
- view:浅复制
- 共享内存
- copy:深复制
- 独享内存
实例
a = np.arange(16).reshape(2, 4, 2)
# 水平方向拆分成2部分
np.hsplit(a, 2)
# 垂直方向拆分成2部分
np.vsplit(a, 2)
# 深度方向拆分成2部分
np.dsplit(a, 2)
六.排序
描述
- sort():返回输入数组的排序副本
- argsort():返回数组值从小到大的索引号
用法和参数
- np.sort(arr, axis=-1, kind=‘quicksort’, order=None)
- np.argsort(arr, axis=-1, kind=‘quicksort’, order=None)
- arr:要排序的数组
- axis:指定排序的轴,默认-1,表示没有指定排序轴,返回结果将沿着最后的轴排序
- kind:表示排序方法,默认为quicksort
- quicksort:快速排序
- mergesort:归并排序
- heapsort:堆排序
- order:用于排序的字段
实例
a = np.random.random((2, 3))
# 返回行内从小到大排序的索引号(列排序),相当于axis=1(最后的轴)
np.argsort(a)
# 返回行内从小到大排序的一个新数组(列排序)
np.sort(a)
# 返回列内从小到大排序的一个新数组(行排序)
np.sort(a, axis=0)
dt = np.dtype([('name', 'S10'), ('age', int)])
a = np.array([('zh', 21), ('wang', 25), ('li', 17), ('zhao', 27)], dtype=dt)
# 如果指定姓名排序,结果是李王张赵
np.sort(a, order='name')
# 如果指定姓名排序,结果则是李张王赵
np.sort(a, order='age')
七.查找
-
最大值和最小值查找
a = np.random.random((2, 3)) a np.argmax(a) np.argmin(a)
-
非零元素查找
a = np.random.randint(0, 2, (2, 3)) a # 返回非零元素的索引号 np.nonzero(a)
-
使用逻辑表达式查找
a = np.arange(10).reshape((2, 5)) (a>3)&(a<8)
-
使用where条件查找
np.where()函数返回数组中满足给定条件的元素的索引号,其结构为元组,元组的第k个元素对应符合条件的元素在数组k轴上的索引号。a = np.arange(10) np.where(a < 5) a = a.reshape((2, -1)) np.where(a < 5) # 满足条件的元素不变,其他元素乘10 np.where(a < 5, a, 10*a)
八.筛选
- 使用np.where()函数返回的Python元组
- 使用逻辑表达式返回的布尔型数组
- 使用整形数组
a = np.random.random((3, 4))
# 返回大于0.5的元素(使用np.where()函数返回的Python元组)
a[np.where(a>0.5)]
# 返回大于0.3且小于0.7的元素(使用逻辑表达式返回的布尔型数组)
a[(a>0.3)&(a<0.7)]
# 返回整形数组指定的项(使用整形数组)
a[np.array([2, 1])]
a = a.ravel()
# 返回整形数组指定的项(使用整形数组)
a[np.array([3, 5, 7, 11])]
# 返回整形数组指定的项(使用整形数组)
a[np.array([[3, 5], [7, 11]])]
img = np.random.randint(0, 256, (5, 10), dtype=np.uint8)
# 将256级灰度值转为8级灰度值
img = (img/32).astype(np.uint8)
# 灰度字符集
chs = np.array([' ', '.', '-', '+', '=', '*', '#', '@'])
chs[img]
九.数组I/O
数组I/O就是讨论如何分发、交换数据。
a = np.random.random((15, 5))
# 将数组a保存成csv格式的数据文件
np.savetxt('demo.csv', a, delimiter=',')
# 打开csv格式的数据文件
data = np.loadtxt('demo.csv', delimiter=',')
data.shape, data.dtype
# 存储单个数组文件名
single_arr_fn = 'single_arr.npy'
# 存储多个数组文件名
multi_arr_fn = 'multi_arr.npz'
lon = np.linspace(10, 90, 9)
lat = np.linspace(20, 60, 5)
# 用save()函数把经度数组保存成.npy文件
np.save(single_arr_fn, lon)
# 接着用load()函数读出来
lon = np.load(single_arr_fn)
# 保存两个数组到一个文件
np.savez(multi_arr_fn, longitude=lon, latitude=lat)
# 用load()函数把这个.npz文件读成一个结构data
data = np.load(multi_arr_fn)
# 查看所有的数组名
data.files
# 使用data[数组名],就可以得到想要的数据
data['longitude']
data['latitude']
最后
以上就是爱笑草莓为你收集整理的Numpy_操作数组一.索引和切片二.改变数组结构三.合并四.拆分五.复制六.排序七.查找八.筛选九.数组I/O的全部内容,希望文章能够帮你解决Numpy_操作数组一.索引和切片二.改变数组结构三.合并四.拆分五.复制六.排序七.查找八.筛选九.数组I/O所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复