Julia中如何用向量索引获取矩阵指定元素?(对标NumPy)
在Julia中实现按对应行列索引提取矩阵元素
假设我们有如下4×2矩阵:
a = [1 2; 3 4; 5 6; 7 8] # 输出: # 4×2 Matrix{Int64}: # 1 2 # 3 4 # 5 6 # 7 8
想要通过两个等长向量指定对应位置的行和列提取元素:比如取a[1,1]和a[3,2],预期输出为1×2矩阵:
1×2 Matrix{Int64}: 1 6
在Python NumPy中,a[[1,3], [1,2]]可以直接得到这个结果,但Julia中执行相同代码会生成行和列的笛卡尔积,得到2×2矩阵:
a[[1,3], [1,2]] # 输出: # 2×2 Matrix{Int64}: # 1 2 # 5 6
这是因为Julia的向量索引逻辑是生成所有行和列的组合,而非对应位置匹配。以下是几种Julia的实现方式:
方法1:使用CartesianIndex构造坐标数组
CartesianIndex可以直接表示矩阵的二维坐标,构造坐标数组后即可提取对应元素:
# 构造目标坐标数组 indices = [CartesianIndex(1, 1), CartesianIndex(3, 2)] # 提取元素并转换为1×2矩阵 result = reshape(a[indices], 1, 2)
运行结果:
1×2 Matrix{Int64}: 1 6
方法2:广播调用getindex
通过Ref(a)固定矩阵对象,对行、列向量进行广播索引:
# 广播提取元素,再转换为1×2矩阵 result = reshape(getindex.(Ref(a), [1,3], [1,2]), 1, 2)
运行结果同上。
方法3:计算线性索引
Julia中矩阵按列存储,可通过LinearIndices获取元素的线性位置,再提取:
# 获取目标元素的线性索引 linear_idx = [LinearIndices(a)[1,1], LinearIndices(a)[3,2]] # 提取元素并转换为1×2矩阵 result = reshape(a[linear_idx], 1, 2)
运行结果同上。
如果不需要矩阵形式,直接提取的结果是向量[1,6],可根据需求选择是否用reshape转换。
内容的提问来源于stack exchange,提问作者PokeLu
相关产品推荐
相关产品推荐

