我是靠谱客的博主 大力美女,这篇文章主要介绍Numpy_操作数组一.索引和切片二.改变数组结构三.合并四.拆分五.复制六.排序七.查找八.筛选九.数组I/O,现在分享给大家,希望可以做个参考。

一.索引和切片

描述

  • 索引是定位一维或多维数组中的单个或多个元素的行为模式
  • 切片是返回一维或多维数组中单个或多个相邻元素的视图,目的是引用或赋值

实例

复制代码
1
2
3
4
5
6
7
8
9
10
a = np.arange(9) # 最后一个元素 a[-1] # 返回第2到第5个元素 a[2:5] # 返回第0到7个元素,步长为3 a[:7:3] # 返回逆序的数组 a[::-1]
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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]
复制代码
1
2
3
4
5
6
7
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():翻滚轴,返回新的视图,不改变原有数组

实例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)
复制代码
1
2
3
4
5
6
7
8
9
10
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():深度合并函数

实例

复制代码
1
2
3
4
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)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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():深度方向拆分

实例

复制代码
1
2
3
4
5
6
7
8
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:深复制
    • 独享内存

实例

复制代码
1
2
3
4
5
6
7
8
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:用于排序的字段

实例

复制代码
1
2
3
4
5
6
7
8
a = np.random.random((2, 3)) # 返回行内从小到大排序的索引号(列排序),相当于axis=1(最后的轴) np.argsort(a) # 返回行内从小到大排序的一个新数组(列排序) np.sort(a) # 返回列内从小到大排序的一个新数组(行排序) np.sort(a, axis=0)
复制代码
1
2
3
4
5
6
7
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')

七.查找

  • 最大值和最小值查找

    复制代码
    1
    2
    3
    4
    5
    a = np.random.random((2, 3)) a np.argmax(a) np.argmin(a)
  • 非零元素查找

    复制代码
    1
    2
    3
    4
    5
    a = np.random.randint(0, 2, (2, 3)) a # 返回非零元素的索引号 np.nonzero(a)
  • 使用逻辑表达式查找

    复制代码
    1
    2
    3
    a = np.arange(10).reshape((2, 5)) (a>3)&(a<8)
  • 使用where条件查找
    np.where()函数返回数组中满足给定条件的元素的索引号,其结构为元组,元组的第k个元素对应符合条件的元素在数组k轴上的索引号。

    复制代码
    1
    2
    3
    4
    5
    6
    7
    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元组
  • 使用逻辑表达式返回的布尔型数组
  • 使用整形数组
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
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]])]
复制代码
1
2
3
4
5
6
7
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就是讨论如何分发、交换数据。

复制代码
1
2
3
4
5
6
7
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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 存储单个数组文件名 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_操作数组一内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(88)

评论列表共有 0 条评论

立即
投稿
返回
顶部