【问题标题】:Getting a grid of a matrix via logical indexing in Numpy通过 Numpy 中的逻辑索引获取矩阵的网格
【发布时间】:2013-06-29 20:19:29
【问题描述】:

我正在尝试使用最初在 MATLAB 中的 numpy 重写一个函数。 MATLAB中有一个逻辑索引部分如下:

X = reshape(1:16, 4, 4).';
idx = [true, false, false, true];
X(idx, idx)

ans =

     1     4
    13    16

当我尝试在 numpy 中创建它时,我无法获得正确的索引:

X = np.arange(1, 17).reshape(4, 4)
idx = [True, False, False, True] 
X[idx, idx]
# Output: array([6, 1, 1, 6])

通过逻辑索引从矩阵中获取网格的正确方法是什么?

【问题讨论】:

  • 我注意到我可以通过X[idx,:][:,idx] 做到这一点,但这不是很奇怪吗?

标签: python matlab numpy matrix-indexing


【解决方案1】:

你也可以写:

>>> X[np.ix_(idx,idx)]
array([[ 1,  4],
       [13, 16]])

【讨论】:

  • +1;不知道np.ix_。但是,这种方法的性能比“常规索引”差(2 倍)。
  • @root:这与您的方法不同,因为它允许修改切片矩阵,而您的方法提供只读访问权限:wiki.scipy.org/…
  • 真的,真的。您可能希望将其添加到您的答案中。
  • 不知何故我看不出这两种方法之间的区别,你能举个例子来说明区别吗?
  • @Akavall -- Amro 支持分配,而我的更快;所以他们有不同的用例。也就是X[np.ix_(idx, idx)]=np.zeros((2,2))修改了原来的数组,而X[idx][:,idx]=np.zeros((2,2))没有。
【解决方案2】:
In [1]: X = np.arange(1, 17).reshape(4, 4)

In [2]: idx = np.array([True, False, False, True])  # note that here idx has to
                                                    # be an array (not a list)
                                                    # or boolean values will be 
                                                    # interpreted as integers

In [3]: X[idx][:,idx]
Out[3]: 
array([[ 1,  4],
       [13, 16]])

【讨论】:

  • +1 我不知道将ìdx 列表转换为数组将允许使用x[idx] 进行正确索引
【解决方案3】:

numpy 中,这称为fancy indexing。要获得您想要的项目,您应该使用 2D 索引数组。

您可以使用outer 从您的一维idx 中创建一个适当的2D 索引数组。 The outers,当应用于两个1D 序列时,将一个序列的每个元素与另一个序列的每个元素进行比较。回想一下True*True=TrueFalse*True=Falsenp.multiply.outer()np.outer() 相同,可以为您提供2D 索引:

idx_2D = np.outer(idx,idx)
#array([[ True, False, False,  True],
#       [False, False, False, False],
#       [False, False, False, False],
#       [ True, False, False,  True]], dtype=bool)

你可以使用的:

x[ idx_2D ]
array([ 1,  4, 13, 16])

在您的真实代码中,您可以使用x=[np.outer(idx,idx)],但它不会节省内存,其工作方式与在执行切片后包含del idx_2D 相同。

【讨论】:

  • 您不会通过不将该中间数组分配给变量来节省任何内存:它被创建、使用然后被丢弃。就像你在索引后写了del idx_2D一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2017-12-28
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多