数组索引
切片索引
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) # 切片创建副本