python中[-1] [:-1] [::-1] [n::-1] 切片的用法

首先简明概要说明用法,然后再用实际例子阐述。

用法概述

[-1] [:-1] [::-1] [n::-1]都是python中切片的使用方法。

  • [-1]:获取最后一个元素,类似于matlab中的end;
  • [:-1]:除了最后一个元素,获取其他所有的元素;
  • [::-1]:对第一个到最后一个元素进行倒序之后取出;
  • [n::-1]:对第一个到第n个元素进行倒序后取出。

一般用法

在Python中,切片(slice)是对序列型对象(如list, string, tuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。

基本索引

我们从Python的基本索引开始,即单个整数的索引。假设被索引的序列仍为之前提到的a,则基本索引的语法为a[index],其中index为下标。读者可能会觉得这里过于简单,但我们要强调的是Python一个语法糖:负数下标索引,即:index可以取为负数,当其为-n时,对倒数第n个元素进行索引。我们用一张表格值观展示a的索引范围。
在这里插入图片描述

简单的切片

简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,这个与matlab中的索引不大相同。其中start和stop为负数时,简单看作是负数下标对应的位置即可:

X = [1,2,3,4,5]
X[-3:-1]
[3, 4]
  • 切片超出索引范围:当start或stop超出上文提到的有效索引范围​时,切片操作不会抛出异常,而是进行截断。
#实质上截断为了X[-3:5]
X[-3:100]
[3, 4, 5]
  • 缺省:start和stop都是可以缺省的,在缺省的情况下,Python的行为是尽可能取最大区间,具体来说:
#当step为正值,或者默认为1时,start的缺省值是无穷小(​),stop的缺省值是无穷大(​)
#等效于X[0:3],前闭后开
X[:3]
[1, 2, 3]
#当step为负值是,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大
X[:3:-1]
#等效于X[4:3],前闭后开
[5]
扩展切片

扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。

  • step为正数:按照step的间距,从最开始索引到最终值;
X[1:4:2]
[2, 4]
  • step为负数:
X[-1:1:-2]
[5, 3]

实例说明

  • [-1]:获取最后一个元素,类似于matlab中的end;
#-1即为负向第一个索引
X[-1]
5
  • [:-1]:除了最后一个元素,获取其他所有的元素;
#由于step为缺省,默认为1,那么start缺省时取最小值0,即等效于X[0:-1]
X[:-1]
[1, 2, 3, 4]
  • [::-1]:对第一个到最后一个元素进行倒序之后取出;
#由于step为-1是逆序,那么start缺省时取最大值4,stop缺省时取最小值-6,即等效于X[4:-6:-1]
X[::-1]
[5, 4, 3, 2, 1]
  • [n::-1]:对第一个到第n个元素进行倒序后取出。
#由于step为-1是逆序,其中start为n,stop缺省时取最小值0,即等效于X[n:-(len+1):-1],即从第n个元素开始取出到第1个元素。
X[3::-1]
[4, 3, 2, 1]
#等效于X[3:-6:-1]

部分内容参考:https://zhuanlan.zhihu.com/p/79541418

  • 47
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我来给你展示一下用 Python 实现 α-shape 算法提取点云切片轮廓点的代码。 ```python import numpy as np from scipy.spatial import Delaunay def alpha_shape(points, alpha): """ 计算α-shape算法提取点云切片轮廓点 :param points: 点云数据,格式为 N x 3 的 numpy 数组,表示 N 个点的 x、y、z 坐标 :param alpha: 参数α,决定了α-shape的形态 :return: 轮廓点坐标,格式为 M x 3 的 numpy 数组,表示 M 个点的 x、y、z 坐标 """ # 构建 Delaunay 三角剖分 tri = Delaunay(points) # 计算每个三角形的外接圆半径 circum_radius = np.sqrt(np.sum((tri.points[tri.simplices][:, :, :] - tri.circumcenters[:, np.newaxis, :]) ** 2, axis=(1, 2))) # 根据参数 alpha,筛选出需要保留的三角形 edge_length = np.max(tri.transform[:, :2].dot((tri.points[tri.simplices][:, 1] - tri.points[tri.simplices][:, 0])[:, :2, :]), axis=1) keep = circum_radius < 1.0 / alpha * edge_length # 获取保留三角形的边界点 tri_points = tri.points[tri.simplices][keep] edges = np.concatenate((tri_points[:, :2], tri_points[:, 1:], tri_points[:, ::2]), axis=0) edge_points = edges[np.lexsort((edges[:, 1], edges[:, 0]))] edge_diff = np.diff(edge_points, axis=0) edges_idx = np.concatenate((np.array([0]), np.where(np.any(edge_diff, axis=1))[0] + 1, np.array([edge_points.shape[0]]))) # 获取边界点的坐标 contour_points = [] for i in range(edges_idx.shape[0] - 1): contour_points.append(edge_points[edges_idx[i]:edges_idx[i + 1]][0]) contour_points.append(edge_points[edges_idx[-1] - 1]) # 返回轮廓点坐标 return np.array(contour_points) ``` 使用方法: ```python # 生成一些随机的点云数据 points = np.random.rand(100, 3) # 计算轮廓点 contour_points = alpha_shape(points, 0.5) # 打印轮廓点坐标 print(contour_points) ``` 其,`points` 是点云数据,格式为 N x 3 的 numpy 数组,表示 N 个点的 x、y、z 坐标;`alpha` 是参数α,决定了α-shape的形态;`contour_points` 是轮廓点坐标,格式为 M x 3 的 numpy 数组,表示 M 个点的 x、y、z 坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值