如何在Python3与Numpy中实现Matlab式数组多子集提取?
在NumPy中实现Matlab的数组创建与多子集提取操作
1. 创建等差数组(等效Matlab a=1:0.5:10)
Matlab的start:step:end会包含终点值,而NumPy的np.arange是左闭右开区间,所以可以通过两种方式生成等效数组:
- 用
np.arange时,把终点设为略大于目标值(比如10.01),确保包含10 - 用
np.linspace直接指定生成的总点数(计算方式:(10-1)/0.5 +1 =19)
import numpy as np # 方法1:np.arange实现 a = np.arange(1, 10.01, 0.5) # 方法2:np.linspace实现(结果完全一致) a = np.linspace(1, 10, num=19)
两种方法生成的数组都是[1., 1.5, 2., ..., 10.]。
2. 提取多子集(等效Matlab b=a([1:3 10:13]))
注意Matlab是1起始索引,NumPy是0起始索引,需要把Matlab的索引减1转换:
- Matlab的
1:3对应NumPy的0:3(取前3个元素) - Matlab的
10:13对应NumPy的9:13(切片9:13会取索引9、10、11、12,对应Matlab的10到13)
用np.r_可以像Matlab那样拼接多个切片/索引,生成连续的索引数组,直接用于提取:
# 组合索引并提取目标子集 b = a[np.r_[0:3, 9:13]]
运行后b的结果为[1., 1.5, 2., 5.5, 6., 6.5, 7.],和Matlab输出完全一致。
针对你的实际场景(1×7向量、随机索引)
如果是长度为7的1维向量,需要提取随机分布的子集(混合单个索引和切片),直接用np.r_拼接即可:
# 示例:长度为7的目标向量 vec = np.array([10,20,30,40,50,60,70]) # 提取索引0、2-4、6的元素 subset = vec[np.r_[0, 2:5, 6]] # 结果:array([10, 30, 40, 50, 70])
如果只是离散的单个索引,直接传入列表也可行:vec[[0,2,6]]。
内容的提问来源于stack exchange,提问作者Jared Lo
相关产品推荐
相关产品推荐

