繁体   English   中英

根据每一行的第一个元素返回NumPy数组的子集

[英]Return the subset of NumPy array according to the first element of each row

我正在尝试获取给定NumPy数组alist的子集x ,以使每行的第一个元素必须在列表r中

>>> 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中执行此操作?

从输入数组中切出第一列(基本上从每一行中选择第一个elem),然后使用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]])

您可以使用一些索引技巧为有效行构造索引数组:我们可以添加一个附加维度,并检查与第一列中每个元素的相等性:

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)形布尔数组,如果有的话给定行中的值中的TrueTrue ,我们保留该索引。 所得的索引数组与Divakar的答案中np.in1d完全相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM