NumPy实现Matlab二维A([],[])索引的等效命令及报错解决
Matlab二维数组双向量索引的NumPy等效实现
问题复现
需要实现Matlab中二维数组A([行索引序列],[列索引序列])取矩形子块并赋值的功能,场景中行、列索引均为非连续值,且两个索引序列完全相同。
最初尝试的代码如下:
import numpy as np kk = np.zeros((100,100)) k = np.array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]]) kk[[9,2,7],[9,2,7]] = k
运行后抛出错误:
ValueError: shape mismatch: value array of shape (3,3) could not be broadcast to indexing result of shape (3,)
报错原因
NumPy默认将两个等长一维数组作为索引时,执行的是成对位置索引,只会匹配(9,9)、(2,2)、(7,7)三个对角线点位,返回结果形状为(3,),无法接收形状为(3,3)的二维数组赋值,和Matlab取两个索引序列交叉矩形块的逻辑不一致。
正确写法
使用np.ix_()构造广播式索引网格,即可完全对齐Matlab的双向量索引逻辑,代码如下:
import numpy as np kk = np.zeros((100,100)) k = np.array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]]) idx = [9, 2, 7] kk[np.ix_(idx, idx)] = k
效果说明
- 赋值后
kk中第9、2、7行和第9、2、7列交叉形成的3×3子块,和k的元素完全对应 np.ix_()会将输入的一维索引转换为可广播的二维网格结构,索引得到的子块形状为(len(行索引), len(列索引)),和待赋值的二维数组形状完全匹配,不会出现广播错误- 该写法同样支持行、列索引序列不相同的场景,只需将两个不同的索引序列分别传入
np.ix_()的两个参数位置即可
内容的提问来源于stack exchange,提问作者wzboss
相关产品推荐
相关产品推荐

