Numpy数组索引与数组视图

本文详细介绍了NumPy中数组的切片索引、花式索引(包括按行/列和布尔条件)、以及视图与副本的区别,强调了在处理数组时使用视图以提高内存效率的重要性。
摘要由CSDN通过智能技术生成

数组索引

切片索引

import numpy as np

# 数组索引

a = np.arange(9).reshape(3, 3)
print('a:', a)
row = a[0]           # 切片,按行索引,返回视图
col = a[:, 0]        # 切片,按列索引,返回视图
row[0] = 100
col[1] = 200
print('row:', row, 'col:', col)
print('a:', a)

花式索引

import numpy as np

# 花式索引

a = np.arange(9).reshape(3, 3)
print('a:', a)
rows = a[[0, 2]]     # 按行花式索引,返回副本
cols = a[:, [0, 2]]  # 按列花式索引,返回副本
rows[0, :] = 200
cols[0, :] = 300
print('rows:', rows)
print('cols:', cols)
print('a:', a)

花式布尔索引

import numpy as np

# 花式布尔索引

a = np.arange(9).reshape(3, 3)
print('a:', a)

mask = np.array([True, False, True])  
rows = a[mask]                        # 按行花式索引,返回副本
cols = a[:, mask]                     # 按列花式索引,返回副本
a[mask] = 100                         # 花式布尔索引,按行修改部分元素
a[:, mask] = 200                      # 花式布尔索引,按列修改部分元素
print('rows:', rows)
print('cols:', cols)
print('a:', a)

a = np.arange(9).reshape(3, 3)
a1 = a[a > 2]                         # 用同维的布尔数组作为索引,返回独立的一维数组
a1[0] = 300
print('a:', a)
print('a1:', a1)

a[a != 5] = 0                         # 通过布尔索引修改元素 
print('a:', a)
# 切片索引的索引值是连续的,花式索引的索引值是离散的
# 花式索引,是包含多个离散索引值的一组索引,创建新的独立数组,返回原数组的副本
# 布尔索引,True选择对应位置的元素,False不选择元素

import numpy as np

a = np.arange(9).reshape(3, 3)
a1 = a[[0, 2]]            # 列表作为花式索引
a2 = a[np.array([0, 2])]  # 数组作为花式索引
a3 = a[a > 5]             # 布尔索引,返回一维数组
# a1[:] = 5
# a2[:] = 6
# a3[:] = 7
print('a1:', a1)
print('a2:', a2)
print('a3:', a3)
print('a:', a)

 数组视图

import numpy as np

"""
对数组切片生成视图,视图数组跟原数组共享同一个底层数组,即使用同一个数据。
视图数组改变时,原数组也发生变化。
数组副本是复制原数组,是独立于原数组的,副本数组的改变不会影响原数组。
对数组操作尽量使用视图而不是副本,可以降低对内存的占用,提高程序的运行效率。
"""

a = np.arange(9).reshape(3, 3)
# 视图与副本
a1 = a[:2, :2]                        # 切片创建视图
a2 = a[:2, :2].copy()                 # 切片创建副本
a3 = np.copy(a[:2, :2])               # 切片创建副本
a4 = np.array(a[:2, :2], copy=False)  # 切片创建视图
a5 = np.array(a[:2, :2], copy=True)   # 切片创建副本

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值