import numpy as np
# [] 里面下标可以设置
# 1. 正负整数, 例如:np[0]、np[-1]、np[0][0]、np[-1][-1]
# 2. 列表表达式,例如:np[[1, 2, 3]]
# 3. 范围表达式,例如:np[1: 4], 从1位置开始到4之前结束,左闭右开
# 4. 逗号表达式,例如:np[0, 1],逗号前为行、逗号后为列,适合多维数组
# 5. 布尔表达式,例如:np[[True, True, False, False]]
# 1. 正负整数下标 : 用于获得一维、多维数组中指定位置的元素
def test01():
nd1 = np.arange(9)
nd2 = np.arange(9).reshape((3, 3))
print(nd1)
print(nd2)
print("-" * 10)
print(nd1[0], nd1[-1], nd2[0][0], nd2[-1][-1])
# 2. 列表表达式 : 用于获得一维、多维数组中多个位置的元素
def test02():
nd1 = np.arange(9)
nd2 = np.arange(9).reshape((3, 3))
# 获得下标为 1、3、5 位置的元素
print(nd1[[1, 3, 5]])
# 获得下标为 0、2 位置的一维数组
print(nd2[[0, 2]])
# 3. 逗号表达式,例如:np[0, 1],逗号前为行、逗号后为列,用于多维数组
def test03():
# 3.1 一维数组:不能用
# nd1 = np.arange(9)
# print(nd1[0, 0])
# 3.2 多维数组
nd2 = np.arange(9).reshape((3, 3))
print(nd2)
print("-" * 10)
# 获得第 2 行第 1 列数据
print(nd2[2, 1])
print("-" * 10)
# 获得第 0 行第 1 列元素、2 行 2 列元素
print(nd2[[0, 2], [1, 2]])
print("-" * 10)
print(nd2[[0, 2], [1, 2]])
# 4. 范围表达式,例如:np[1: 4], 从1位置开始到4之前结束,左闭右开
def test04():
nd1 = np.arange(9)
nd2 = np.arange(25).reshape((5, 5))
# 4.1 一维数组
# print(nd1)
# print(nd1[: 3]) # 从开始到 3 下标之前
# print(nd1[3:]) # 从 3 位置开始到结束
# print(nd1[1: 4]) # 从 1 位置开始到 4 位置之前
# 4.2 多维数组
print(nd2)
print("-" * 10)
print(nd2[:3]) # 获得下标 3 之前的所有行
print("-" * 10)
print(nd2[3:]) # 获得下标 3 之后所有的行(包括3)
print("-" * 10)
print(nd2[1:4]) # 获得下标 1 开始到下标 4 之前所有的行
print("-" * 10)
# 4.3 范围表达式+逗号表达式
"""
1. 先获得下标 1 开始到最后的所有行
2. 再获得这些行的从开始到下标 2 之前所有的元素
"""
print(nd2[1:, :2])
print("-" * 10)
"""
1. 先获得所有的行
2. 再获得每一行的 1 下标开始,3下标之前的元素
"""
print(nd2[:, 1:3])
print("-" * 10)
"""
1. 先获得 1、2、3 行
2. 再获得这些行的下标为 1 到 3 之前的列
"""
print(nd2[[1, 2, 3], 1: 3])
print("-" * 10)
"""
1. 先获得所有行
2. 再获得这些行的 0、2、3 列
"""
print(nd2[:, [0, 2, 3]])
print("-" * 10)
"""
1. nd2[[0, 2, 3]] 先获得 0、2、3 行
2. [:, [0, 2, 3]] 再获得每一行的的 0、2、3 列
"""
print(nd2[[0, 2, 3]][:, [0, 2, 3]])
# 5. 布尔表达式,例如:np[[True, True, False, False]]
def test05():
line_data = np.arange(9).reshape(3, 3)
print(line_data)
print("-" * 10)
# 获得第 1、2 行内容
print(line_data[[True, True, False]])
print("-" * 10)
# 5.1 获得指定行
line_name = np.array(["a", "b", "c"])
# 获得名字为 a 的这一行
print(line_data[line_name == "a"])
print("-" * 10)
# 获得名字为 a、c 的这两行
print(line_data[(line_name == "a") | (line_name == "c")])
print("-" * 10)
# 获得大于 a <= cond < c 的这些行
print(line_data[(line_name >= "a") & (line_name < "c")])
print("-" * 10)
# 获得行名字不为 a 的这些行
print(line_data[line_name != "a"])
print("-" * 10)
# 获得行名字不为 a 的这些行
print(line_data[~(line_name == "a")])
print("-" * 10)
# 5.2 获得指定列
column_name = np.array(["c1", "c2", "c3"]) # 创建列名
"""
获得列名为 c1、c3 的两列内容
"""
print(line_data[:, (column_name == "c1") | (column_name == "c3")])
# 6. np.where
def test06():
nd1 = np.arange(21, 30).reshape((3, 3))
nd2 = np.arange(11, 20).reshape((3, 3))
# 6.1 把所有 nd1 > 25 的元素替换成 0
print(np.where(nd1 > 25, 0, nd2))
print("-" * 10)
# 6.2 将 nd1、nd2 中的最大值组成新的数组
print(np.where(nd1 > nd2, nd1, nd2))
if __name__ == "__main__":
test06()
numpy 数组索引和切片
未经允许不得转载:一亩三分地 » numpy 数组索引和切片

冀公网安备13050302001966号