Numpy_操作数组

一.索引和切片

描述

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

实例

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']
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值