假设我有一个矩阵M
和一个索引集idx=[(0,1),(2,3),(3,2)]
,我想创建两组元组,idx_leq1
由那些第一和第二元素都小于的元组组成。或等于1和idx_geq2
由第一和第二个元素都大于或等于2的元组组成。
我想干净地访问元素M[idx_leq1]
和M[idx_geq2]
。我尝试了idx_leq1 = tuple([e for e in idx if e[0]<=1 and e[1]<=1])
,但这会返回idx_leq1 = ((0,1),)
,我无法将其用于索引M
。另一方面,idx_geq2 = tuple([e for e in idx if e[0]>=2 and e[1]>=2]) = ((2,3),(3,2))
有效。
如果我的第一个索引集只包含一个坐标对,我该如何解决这个问题呢?我不想M[idx_leq1[0]]
。
我可以:list(chain(*[(e,) for e in idx if e[0]<=1 and e[1]<=1]))
和list(chain(*[(e,) for e in idx if e[0]>=2 and e[1]>=2]))
,但我仍然必须抓住idx_leq1
的第一个元素,而我可以将idx_geq2
传递给M
并抓住适当的元素。
谢谢!
答案 0 :(得分:0)
[经numpy.mat
测试]
[M[0, 1]]
中一样提取 M[[0], [1]]
。索引矩阵时,多维位置列表索引需要k个索引列表,每个索引都使用一个维度。
例如,要获取M[0, 3], M[1, 4], M[2, 5]
,应使用M[[0, 1, 2], [3, 4, 5]]
。换句话说,您提供给M
的索引不应被视为坐标列表。相反,它们是“每个维度上的坐标”的列表
在您的情况下,M[[0, 1]]
(或其在元组类型中的等价物)提取M[0], M[1]
为[0, 1]
被视为在第一维上工作,第二维被广播。
参考:http://scipy-cookbook.readthedocs.io/items/Indexing.html#Multidimensional-list-of-locations-indexing
这个引用认为使用“dims列表”而不是“坐标列表”的原因是为了节省实例数,因为解包许多元组可能很昂贵。