【问题标题】:Return the subset of NumPy array according to the first element of each row根据每行的第一个元素返回 NumPy 数组的子集
【发布时间】:2016-12-20 11:48:53
【问题描述】:

我正在尝试获取给定 NumPy 数组 alist 的子集 x,这样每行的第一个元素必须在列表 r em>。

>>> import numpy 
>>> alist = numpy.array([(0, 2), (0, 4), (1, 3), (1, 4), (2, 1), (3, 1), (3, 2), (4, 1), (4, 3), (4, 2)])
>>> alist
array([[0, 2],
   [0, 4],
   [1, 3],
   [1, 4],
   [2, 1],
   [3, 1],
   [3, 2],
   [4, 1],
   [4, 3],
   [4, 2]])
>>> r = [1,3]
>>> x = alist[where first element of each row is in r] #this i need to figure out.
>>> x
array([[1, 3],
   [1, 4],
   [3, 1],
   [3, 2]])

在 Python 中执行此操作的任何简单方法(无需循环,因为我有一个大型数据集)?

【问题讨论】:

  • 我不明白你为什么不想循环播放?如果你发现第一次出现你可以打破循环,但我没有看到另一种方法,然后检查第一个元素,检查第二个等等,直到你找到它或没有剩余数据
  • @Lex 原生 python 循环比内置 numpy 方法慢得多,后者通常在后台使用编译代码。
  • 如果您的问题已得到解答,请考虑接受其中一种解决方案。在此处阅读更多信息 - meta.stackexchange.com/questions/5234/…

标签: python arrays numpy vectorization


【解决方案1】:

从输入数组中切出第一列(基本上从每一行中选择第一个元素),然后使用np.in1dr 作为第二个输入来创建此类有效行的掩码,最后索引到数组的行用掩码选择有效的。

因此,实现将是这样的 -

alist[np.in1d(alist[:,0],r)]

示例运行 -

In [258]: alist   # Input array
Out[258]: 
array([[0, 2],
       [0, 4],
       [1, 3],
       [1, 4],
       [2, 1],
       [3, 1],
       [3, 2],
       [4, 1],
       [4, 3],
       [4, 2]])

In [259]: r  # Input list to be searched for
Out[259]: [1, 3]

In [260]: np.in1d(alist[:,0],r) # Mask of valid rows
Out[260]: array([False, False,  True,  True, False,  True,  True,
                        False, False, False], dtype=bool)

In [261]: alist[np.in1d(alist[:,0],r)] # Index and select for final o/p
Out[261]: 
array([[1, 3],
       [1, 4],
       [3, 1],
       [3, 2]])

【讨论】:

  • 这太完美了!!非常感谢:)
【解决方案2】:

您可以使用一些索引技巧为有效行构建索引数组:我们可以添加一个额外的维度并检查第一列的每个元素是否相等:

import numpy as np
alist = np.array([(0, 2), (0, 4), (1, 3), (1, 4), (2, 1),
                     (3, 1), (3, 2), (4, 1), (4, 3), (4, 2)])

inds = (alist[:,0][:,None] == r).any(axis=-1)
x = alist[inds,:] # the valid rows

诀窍是我们取alist 的第一列,使其成为(N,1) 形状的数组,在比较中使用数组广播最终得到(N,2) 形状的布尔数组,如果给定行中的任何值都是True,我们保留该索引。生成的索引数组与Divakar's answer 中的np.in1d 完全相同。

【讨论】:

  • 更短的形式:alist[:,0,None] == r.
  • @Divakar 当然! *facepalm* 谢谢,已编辑:)
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多