python单元素元组

时间:2018-04-25 04:37:28

标签: python indexing tuples

假设我有一个矩阵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并抓住适当的元素。

谢谢!

1 个答案:

答案 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列表”而不是“坐标列表”的原因是为了节省实例数,因为解包许多元组可能很昂贵。