列表因为里面元素可为不同类型,例如
b = [1]
a = ["str", 1.0, 2, None, b]
print(a) # ['str', 1.0, 2, None, [1]]
所以其功能仅支持索引,切片,还有一个特殊用法:列表推导式 。
(当然List类方法有很多,对应有很多其他功能,本文这里只讨论其索引的用法)
b = [1]
a = ["str", 1.0, 2, None, b]
# 切片
print(a[::-1]) # 倒序 [[1], None, 2, 1.0, 'str']
# 索引
print(a[0]) # 列表第0个位置元素 输出 str
# 列表推导式
print([i**2 for i in range(10)]) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
接下来要介绍今天的主人公Numpy类型,NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))
Numpy型在原有索引,切片功能的基础上引入了更便捷的功能
a = np.random.randint(0, 10, (3, 3))
print(a)
#[[0 7 7]
[5 6 2]
[1 3 4]]
# 第一种 取第二行第二列元素
print(a[1, 1]) # 6
# 第二种
取最外层第二个元素集
print(a[[1]]) # [[5 6 2]]
取最外层第二,三个元素集
print(a[[1,2]])
#[[5 6 2]
[1 3 4]]
# 第三种 混合使用索引切片
print(a[:, 2]) # [7 2 4]
a[:, [0, 1]] = a[:, [1, 0]] # 将a数组中第一列和第二列元素换位置
print(a)
#[[7 0 7]
[6 5 2]
[3 1 4]]
# 注意以上三种用法在List的列表中均不可用,可以理解为List索引中括号[]内只能有单个元素
numpy的布尔索引用法
a = np.random.randint(0, 10, 10)
b = a.tolist()
print(a) # [9 0 2 1 6 2 4 9 1 1]
c = a > 5
print(c) # [False False True True True True False False True True]
print(a[c]) # [9 6 9] # 要注意此时c的长度要和a最外层长度一样(意思是索引必须对的上)
# 列表无此用法但是可以用列表推导式得到类似结果
print([i for i in b if i > 5]) # [9, 6, 9]
布尔索引也可以跟其他功能混合使用, 例如:
a = np.random.randint(0, 10, (10, 10))
print(a)
#[[6 0 6 4 6 0 6 7 7 6]
[3 5 3 0 8 0 3 8 3 9]
[7 8 5 4 9 0 2 8 0 0]
[9 5 1 1 6 2 5 3 8 4]
[6 8 3 0 2 9 4 4 8 9]
[1 1 0 3 2 5 9 2 3 7]
[7 1 8 2 2 9 0 4 3 4]
[4 8 5 8 4 0 9 3 1 5]
[7 9 4 7 3 3 5 9 6 8]
[8 7 8 2 3 3 6 2 8 8]]
c = a[0] > 5
print(c)
#[ True False True False True False True True True True]
print(a[::3, c])
#[[6 6 6 6 7 7 6]
[9 1 6 5 3 8 4]
[7 8 2 0 4 3 4]
[8 8 3 6 2 8 8]] # 取c(a[0]>5)中元素为true的位置,在a数组中的指定行内取这些位置的元素