Numpy:索引与切片
numpy基本的索引和切片
import numpy as np
arr = np.array([1,2,3,555,666,888,10])
arr
array([ 1, 2, 3, 555, 666, 888, 10])
# 数组的切片是不会复制,任何视图上的修改都会直接修改源数组
arr[1:5]
array([ 2, 3, 555, 666])
# 广播 将一个标量赋值给一个切片时,自动传播到整个选区
arr[1:5] = 12
# 源数据改变
arr
array([ 1, 12, 12, 12, 12, 888, 10])
注意:由于Numpy的设计目的是处理大数据,所以如果坚持要讲数据复制来复制去的话会产生严重的性能和内存问题。 警告:如果你想得到的是一份副本而非视图,就需要显示复制操作
arr =
array([ 1, 12, 12, 12, 12, 888, 10])
arr_slice = arr[5:8]
array([888, 10])
arr_slice[1] = 123456
# 源数据改变
arr
array([ 1, 12, 12, 12, 12, 888, 123456])
arr_slice[:] = 64
# 源数据改变
arr
array([ 1, 12, 12, 12, 12, 64, 64])
多维数组的操作
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 索引是一维数组,不再是标量
arr2d[2]
array([7, 8, 9])
arr2d[2,0]
7
Numpy数组中的元素索引
arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[0]
array([[1, 2, 3],
[4, 5, 6]])
# 复制一份副本
old_values = arr3d[0].copy()
old_values
array([[1, 2, 3],
[4, 5, 6]])
# 赋值标量
arr3d[0] = 42
arr3d
# 源数据改变
array([[[42, 42, 42],
[42, 42, 42]],
[[ 7, 8, 9],
[10, 11, 12]]])
# 赋值上面的保存的副本
arr3d[0] = old_values
arr3d
# 源数据恢复之前的状态
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[1,0]
array([7, 8, 9])
注意:上面所有的这些选取数组子集的例子中,返回的数组都是视图
切片索引 跟Python列表这样的一维对象差不多
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
arr2d[:2]
array([[1, 2, 3],
[4, 5, 6]])
arr2d[:2,:1]
array([[1],
[4]])
arr2d[2,:1]
array([7])
arr2d[:,:1]
array([[1],
[4],
[7]])
# 对切片赋值也会被扩散到整个选区
arr2d[:2,1:] = 0
arr2d
array([[1, 0, 0],
[4, 0, 0],
[7, 8, 9]])
布尔型索引
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
# 随机生成数字
data = np.random.randn(7,4)
names
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
data
array([[-0.61531969, 0.09937418, -1.15678643, -0.17431226],
[-1.72274669, -0.88961153, -1.21114235, 0.53001087],
[ 0.43352234, 0.32843525, 0.4930513 , -1.78710182],
[ 0.43997916, 0.4744386 , -2.27592661, -0.41136012],
[-0.63605234, -1.31366781, -1.5077842 , -0.98485074],
[-0.62922743, -0.62193719, -0.42214742, 0.94249323],
[ 0.38367682, 0.67807875, 0.32268169, 0.30776196]])
# 假设每个名字都对应data数组中的一行,我们想要选出对应于名字'Bob'的所有行
names == 'Bob'
array([ True, False, False, True, False, False, False])
# 数组的比较运算也是矢量化的
data[names == 'Bob']
array([[-0.61531969, 0.09937418, -1.15678643, -0.17431226],
[ 0.43997916, 0.4744386 , -2.27592661, -0.41136012]])
# 数组的长度必须跟被索引的轴长度一致,此外还可以将布尔型数组跟切片、整数、混合使用
data[names == 'Bob', 2:]
array([[-1.15678643, -0.17431226],
[-2.27592661, -0.41136012]])
data[names == 'Bob', 3]
array([-0.17431226, -0.41136012])
# 要选择'Bob'以外的其他值,既可以使用!=,也可以通过负号(-)对条件进行否定
names != 'Bob'
array([False, True, True, False, True, True, True])
data[names != 'Bob']
array([[-1.72274669, -0.88961153, -1.21114235, 0.53001087],
[ 0.43352234, 0.32843525, 0.4930513 , -1.78710182],
[-0.63605234, -1.31366781, -1.5077842 , -0.98485074],
[-0.62922743, -0.62193719, -0.42214742, 0.94249323],
[ 0.38367682, 0.67807875, 0.32268169, 0.30776196]])
选取这三个名字中的两个需要组合应用于多个布尔条件、使用&(和)、|(或)之类的布尔算数运算符即可
Python关键字and和or在布尔型数组中无效
mask = (names == 'Bob')|(names == 'Will')
mask
array([ True, False, True, True, True, False, False])
data[mask]
array([[-0.61531969, 0.09937418, -1.15678643, -0.17431226],
[ 0.43352234, 0.32843525, 0.4930513 , -1.78710182],
[ 0.43997916, 0.4744386 , -2.27592661, -0.41136012],
[-0.63605234, -1.31366781, -1.5077842 , -0.98485074]])
注意:通过布尔型索引选择数组数据,将总是创建数据的副本,即使返回一模一样的数组也是如此
# 将data中的所有负值都设置为 0
data[data<0] = 0
data
array([[0. , 0.09937418, 0. , 0. ],
[0. , 0. , 0. , 0.53001087],
[0.43352234, 0.32843525, 0.4930513 , 0. ],
[0.43997916, 0.4744386 , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0.94249323],
[0.38367682, 0.67807875, 0.32268169, 0.30776196]])
data[ names != 'Joe'] = 7
data
array([[7. , 7. , 7. , 7. ],
[0. , 0. , 0. , 0.53001087],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[0. , 0. , 0. , 0.94249323],
[0.38367682, 0.67807875, 0.32268169, 0.30776196]])
花式索引
利用整数数组进行索引
arr = np.empty((8,4))
arr
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
for i in range(8):
arr[i] = i
arr
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
# 以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可
arr[[4,3,0,6]]
array([[4., 4., 4., 4.],
[3., 3., 3., 3.],
[0., 0., 0., 0.],
[6., 6., 6., 6.]])
# 使用负数索引
arr[[-3,-5,-7]]
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[1., 1., 1., 1.]])
# 一次传入多个索引数组
arr = np.arange(32).reshape((8,4))
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
#它返回的是一个一维数组,其中的元素对应各个索引元组
arr[[1,5,7,2],[0,3,1,2]]
array([ 4, 23, 29, 10])
# 选取方形区域的索引器
arr[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
注意:花式索引跟切片不一样,它总是将数据复制到新数组中
数组转置和轴对换
- 转置(transpose方法):重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作)。
- T属性
arr1 = np.arange(15).reshape((3,5))
arr1 # 三行五列
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr1.T # 转置为五行三列 适用于二维数组
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
# 在进行矩阵计算时,经常需要用到该操作,内积计算,行行向量乘以列向量
np.dot(arr1.T,arr1)
array([[125, 140, 155, 170, 185],
[140, 158, 176, 194, 212],
[155, 176, 197, 218, 239],
[170, 194, 218, 242, 266],
[185, 212, 239, 266, 293]])
计算方法:计算第几行第几列的数字,就把arr1.T的行取出来 和 arr1的列去乘,例如:
- 125位于第一行第一列,则计算过程 0 * 0 + 5 * 5 + 10 * 10 = 125
- 197位于第三行第三列,则计算过程 2 * 2 + 7 * 7 + 12 * 12 = 197
- 218位于第四行第三列,则计算过程 3 * 2 + 8 * 7 + 13 * 12 = 218
Numpy:索引与切片的更多相关文章
- Numpy 索引及切片
1.一维数组的索引及切片 ar = np.arange(20) print(ar) print(ar[4]) print(ar[3:6]) print(ar[:4:2]) #索引到4 按2的步长 pr ...
- numpy 索引和切片
一.取行 1.单行 数组[index, :] # 取第index+1行 例子 import numpy as np arr1 = np.arange(0, 24).reshape(4, 6) # 取第 ...
- numpy之索引和切片
索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...
- Numpy系列(四)- 索引和切片
Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 自然不会放过这个强大的特性. 单个元素索引 1-D数组的单元素索引是人们期望的.它的工作原理与其他标准Python序 ...
- NumPy学习(索引和切片,合并,分割,copy与deep copy)
NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...
- NumPy 学习 第二篇:索引和切片
数组索引是指使用中括号 [] 来定位数据元素,不仅可以定位到单个元素,也可以定位到多个元素.索引基于0,并接受从数组末尾开始索引的负索引. 举个例子,正向索引从0开始,从数组开始向末尾依次加1递增:负 ...
- numpy数组的索引和切片
numpy数组的索引和切片 基本切片操作 >>> import numpy as np >>> arr=np.arange(10) >>> arr ...
- Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)
一:数组的属性 每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型) 二:数组索引 和python列表一样,N ...
- Numpy学习二:数组的索引与切片
1.一维数组索引与切片#创建一维数组arr1d = np.arange(10)print(arr1d) 结果:[0 1 2 3 4 5 6 7 8 9] #数组的索引从0开始,通过索引获取第三个元素a ...
随机推荐
- winform/timer控件/权限设置/三级联动
一.timer控件 组件--timer timer是一个线程,默认可以跨线程访问对象 属性:Enabled--可用性 Interval--间隔时间 Tick:间隔时间发生事件 二.三级联动 例: pu ...
- MVC基于角色权限控制--菜单展示
在用户成功登陆后台页面后,我们需要将当前用户拥有的权限通过菜单的形式展现出来,将未具备的权限隐藏 新建一个HomeController,用于展示后台首页和获取用户权限数据 namespace CZBK ...
- Python基本数据类型以及字符串
基本数据类型 数字 int ,所有的功能,都放在int里 a1 = 123 a1 = 456 ...
- jquery初级接触-----链式操作
设置一个初级菜单,点击显示本级菜单下的项目,被点击的同级其它菜单收起 html 代码: <!DOCTYPE html> <html lang="en"> & ...
- MVC之Model元数据
Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之. 在整个Action方法的执行过程中,Model元数据的解析是一个 ...
- monkey压力测试
压力测试: monkey -p com.qihu360.mobilesafe -v -p 后面跟包名 : -v 后面跟次数: 通过观察log日志,查看应用中出现的问题. =============== ...
- hadoop /etc/Hadoop/slaves文件解析【转】
slaves文件里面记录的是集群里所有DataNode的主机名,到底它是怎么作用的呢?slaves文件只作用在NameNode上面,比如我在slaves里面配置了 host1 host2 host3 ...
- thymeleaf 的常见属性
- spring boot 使用war包部署
- js固定底部菜单
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...