numpy基础2索引和切片

  1 # coding: utf-8
  2 # numpy数组基础索引与切片
  3 
  4 import numpy as np
  5 arr = np.arange(10)
  6 arr
  7 
  8 # 数组下标从0开始
  9 # 索引
 10 arr[5]
 11 # 切片
 12 arr[5:8]
 13 # 传入数值给数组切片
 14 arr[5:8] = 12
 15 arr
 16 # 数组的切片是原数组的视图,任何对于视图的修改都会反映到原数组上
 17 arr_slice = arr[5:8]
 18 arr_slice
 19 # 改变arr_slice,变化会体现在原数组上
 20 arr_slice[1] = 12345
 21 arr
 22 
 23 # 不写切片值的[:]将会引用数组的所有值
 24 arr_slice[:] = 64
 25 arr
 26 # 在二维数组中索引对应的值不再是一个值,而是一个一维数组,下标从0开始
 27 arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
 28 arr2d[2]
 29 # 获取单个元素值可以通过递归方式得到  两种方法
 30 # 方法1
 31 arr2d[0][2]
 32 #方法2
 33 arr2d[0, 2]
 34 # 在多维数组中可以省略后续索引值,返回对象将是一个降低一个维度的数组
 35 # 2x2x3的数组
 36 arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
 37 arr3d
 38 # 返回2x3的数组
 39 arr3d[0]
 40 # 标量和数组都可以传递给arr3d[0]
 41 old_values = arr3d[0].copy()
 42 arr3d[0] = 42
 43 arr3d
 44 
 45 arr3d[0] = old_values
 46 arr3d
 47 #返回一维数组
 48 arr3d[1, 0]
 49 # 数组的切片索引
 50 # 一维数组
 51 arr
 52 arr[1:6]
 53 # 二维数组
 54 arr2d
 55 arr2d[:2]
 56 # 多组切片
 57 arr2d[:2, 1:]
 58 # 选择第二行且只选择前两列
 59 arr2d[1, :2]
 60 # 选择第三列且只选择前两行
 61 arr2d[:2, 2]
 62 # 单独冒号表示选择整个轴上的数组
 63 arr2d[:, :1]
 64 # 对切片表达式赋值,整个切片都会重新赋值
 65 arr2d[:2, 1:] = 0
 66 arr2d
 67 
 68 #  布尔索引
 69 #  例1.假设数据都在数组中,数组中数据是一些重复的人名,将使用numpy.random中的randn函数生成一些随机正态分布的数据
 70 names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
 71 names
 72 data = np.random.randn(7, 4)
 73 data
 74 # 假设每个人名都和data数组中的一行相对应,我们想要选中所有'Bob'对应的行。
 75 # 比较names数组和字符串数组'Bob'会产生一个布尔值数组
 76 names == 'Bob'
 77 # 在索引数组时可以传入布尔值数组
 78 data[names == 'Bob']
 79 data[names == 'Bob', 2:]
 80 data[names == 'Bob', 3]
 81 
 82 # 为了选择除'Bob'以外的其他数据,可以使用!=或在条件表达式前使用~对条件取反
 83 names != 'Bob'
 84 data[~(names == 'Bob')]
 85 
 86 # ~符号可以在你想要对一个通用条件进行取反时使用
 87 cond = names == 'Bob'
 88 data[~cond]
 89 
 90 #当要选择三个名字中的两个时,可以对多个布尔值条件进行联合,使用 & 和 |
 91 mask = (names == 'Bob')| (names == 'Will')
 92 mask
 93 data[mask]
 94 
 95 # 设置布尔数组的值,将data 中所有负值设置为0
 96 data[data < 0] = 0
 97 data
 98 
 99 # 利用一维布尔值数组对每一行设置数值
100 data[names != 'Joe'] = 7
101 data
102 
103 #  神奇索引,用于描述使用整数数组进行数据索引
104 # 有一个8x4的数组
105 arr = np.empty((8,4))
106 for i in range(8):
107     arr[i] = i
108 arr
109 
110 # 选出符合特定顺序的子集
111 arr[[4, 3, 0, 6]]
112 
113 # 使用负索引,从尾部进行选择
114 arr[[-3, -5, -7]]
115 
116 arr = np.arange(32).reshape((8, 4))
117 arr
118 
119 # 传递多个索引时,根据每个索引元组对应的元素选出一个一维数组
120 arr[[1, 5, 7, 2],[0, 3, 1, 2]]
121 
122 arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
123 
124 
125 #  数组转置和换轴
126 # 数组的T属性
127 arr = np.arange(15).reshape((3, 5))
128 arr
129 arr.T
130 
131 # 计算矩阵内积np.dot
132 arr = np.random.randn(6, 3)
133 arr
134 np.dot(arr.T, arr)
135 
136 # 对于高维数组,transpose方法可以接受包含轴编号的元组,用于置换轴
137 arr = np.arange(16).reshape((2, 2, 4))
138 arr
139 
140 # 原先的第二个轴变为第一个,第一个变为第二个轴
141 arr.transpose((1, 0, 2))
142 
143 # swapaxes方法,接收一对轴编号作为参数,并对轴进行调整用于重组数据
144 arr
145 arr.swapaxes(1, 2)

参考书籍:利用 python 进行数据分析

作者:舟华520

出处:https://www.cnblogs.com/xfzh193/

本文以学习,分享,研究交流为主,欢迎转载,请标明作者出处!

原文地址:https://www.cnblogs.com/xfzh193/p/11222686.html