Python中如何用两个一维数组对二维数组进行下标索引
嗨,从Matlab转Python遇到索引逻辑的差异太正常了,我来帮你搞定这个问题!
首先得搞清楚你原来的写法为啥不对:
当你写a[patch]的时候,确实会取出前两行,得到一个2×3的数组;但接着写[patch],其实是对这个新的2×3数组再次按行索引,相当于取它的前两行(也就是它本身),所以结果还是2×3,这和你想要的同时对原数组的行、列进行索引完全不是一回事儿。
在NumPy里,要实现类似Matlab中a(patch,patch)的二维块索引(也就是取出所有行在patch里、列也在patch里的元素),有两种很直观的方法:
方法1:手动给行索引增加一个维度
通过patch[:, np.newaxis]把一维的patch变成二维的列向量,这样和列索引的patch组合时,NumPy会自动广播成二维的网格索引,就能得到你要的2×2矩阵:
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]]) patch = np.arange(2) result = a[patch[:, np.newaxis], patch] print(result) # 输出: # [[1 2] # [4 5]]
方法2:用np.ix_函数更直观
NumPy专门提供了np.ix_函数来生成这种网格索引,可读性更强,尤其适合复杂的索引场景:
result = a[np.ix_(patch, patch)] print(result) # 同样输出: # [[1 2] # [4 5]]
简单说,np.ix_(patch, patch)会把两个一维数组转换成能正确匹配的行、列索引对,帮你避免手动处理维度的麻烦。
对比Matlab的话,NumPy的索引更强调维度的匹配:直接用两个一维数组逗号分隔的话(比如a[patch, patch]),会得到(0,0)和(1,1)位置的元素,也就是[1,5],这是元素级的配对索引,不是你要的块索引,这也是两者最大的区别之一。
内容的提问来源于stack exchange,提问作者Mikhail Genkin
相关产品推荐
相关产品推荐

