【问题标题】:Shorter version of this numpy array indexing这个 numpy 数组索引的较短版本
【发布时间】:2016-10-20 06:07:47
【问题描述】:

我在 python 中有以下代码(numpy 数组或 scipy.sparse.matrices),它可以工作:

X[a,:][:,b]

但它看起来并不优雅。 'a' 和 'b' 是一维布尔掩码。

'a' 与 X.shape[0] 的长度相同,'b' 与 X.shape[1] 的长度相同

我尝试了X[a,b],但它不起作用。

我想要完成的是同时选择特定的行和列。例如,选择第 0,7,8 行,然后从该结果中选择第 2,3,4 列中的所有行

你会如何让它更短更优雅?

【问题讨论】:

  • 不,这是一个二维矩阵。
  • 您使用的是 NumPy 数组还是 NumPy 矩阵?
  • X 是一个 scipy 稀疏矩阵,但我认为索引与密集 numpy 数组矩阵中的索引相同。
  • NumPy 数组与 NumPy 矩阵是不同的东西。见这里:stackoverflow.com/questions/4151128/…
  • 好的。我不使用numpy矩阵,我现在改了标题。

标签: python numpy matrix indexing


【解决方案1】:

您可以将np.ix_ 用于这样的broadcasted indexing,就像这样 -

X[np.ix_(a,b)]

虽然这不会比原始代码短,但希望应该更快。这是因为我们避免了中间输出,因为原始代码使用一个切片创建 X[a,:],然后另一个切片 X[a,:][:,b] 为我们提供最终输出。

此外,此方法适用于 ab 作为 intboolean 数组。

示例运行

In [141]: X = np.random.randint(0,99,(6,5))

In [142]: m,n = X.shape

In [143]: a = np.in1d(np.arange(m),np.random.randint(0,m,(m)))

In [144]: b = np.in1d(np.arange(n),np.random.randint(0,n,(n)))

In [145]: X[a,:][:,b]
Out[145]: 
array([[17, 81, 64],
       [87, 16, 54],
       [98, 22, 11],
       [26, 54, 64]])

In [146]: X[np.ix_(a,b)]
Out[146]: 
array([[17, 81, 64],
       [87, 16, 54],
       [98, 22, 11],
       [26, 54, 64]])

运行时测试

In [147]: X = np.random.randint(0,99,(600,500))

In [148]: m,n = X.shape

In [149]: a = np.in1d(np.arange(m),np.random.randint(0,m,(m)))

In [150]: b = np.in1d(np.arange(n),np.random.randint(0,n,(n)))

In [151]: %timeit X[a,:][:,b]
1000 loops, best of 3: 1.74 ms per loop

In [152]: %timeit X[np.ix_(a,b)]
1000 loops, best of 3: 1.24 ms per loop

【讨论】:

  • 在我的例子中,'a' 和 'b' 是布尔掩码。
  • 查看ix_ 的输出,看看没有它怎么办。
  • np.ix_np.nonzero 应用于布尔参数,将它们转换为索引。
猜你喜欢
  • 1970-01-01
  • 2018-10-25
  • 2022-01-05
  • 1970-01-01
  • 2019-05-26
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
相关资源
最近更新 更多