在numpy结构化数组python中搜索部分匹配

时间:2015-01-15 17:48:16

标签: python search numpy

我有一个numpy结构化数组,例如B具有以下形式

array([('J0006+1834', '-99', 0.693748, 2.1e-15),
   ('J0007+7303', 'NRAD', 0.315873, 3.6e-13),
   ('B0011+47', '-99', 1.240699, 5.64e-16), ...,
   ('B2334+61', '-99', 0.49537, 1.93e-13),
   ('J2346-0609', '-99', 1.181463, 1.36e-15),
   ('B2351+61', '-99', 0.944784, 1.63e-14)], 
  dtype=[('Name', 'S10'), ('Type', 'S10'), ('P0', '<f8'), ('P1', '<f8')])

我需要能够搜索名为Type的第二列的部分匹配。我的数组包含以NR开头的secong列中的值,我希望能够将它们作为一个组进行搜索。我尝试了np.where和startwidth,但我没有成功。我也尝试过使用通配符,但没有任何效果。

理想情况下,我想要一个像这样的命令

B[B['Type']=='NR*']

将返回alla元素的元素,列中的类型以NR开头。

感谢您的时间,我期待着您的回复。

1 个答案:

答案 0 :(得分:1)

如果您真的想使用numpy,可以使用np.char.startswith

>>> np.char.startswith(d["Type"], "NR")
array([False,  True, False, False, False, False], dtype=bool)
>>> d[np.char.startswith(d["Type"], "NR")]
array([('J0007+7303', 'NRAD', 0.315873, 3.6e-13)], 
      dtype=[('Name', 'S10'), ('Type', 'S10'), ('P0', '<f8'), ('P1', '<f8')])

但恕我直言,这实际上更像是一个pandas问题:

>>> df = pd.DataFrame(d)
>>> df
         Name  Type        P0            P1
0  J0006+1834   -99  0.693748  2.100000e-15
1  J0007+7303  NRAD  0.315873  3.600000e-13
2    B0011+47   -99  1.240699  5.640000e-16
3    B2334+61   -99  0.495370  1.930000e-13
4  J2346-0609   -99  1.181463  1.360000e-15
5    B2351+61   -99  0.944784  1.630000e-14
>>> df[df.Type.str.startswith("NR")]
         Name  Type        P0            P1
1  J0007+7303  NRAD  0.315873  3.600000e-13

不可否认,这里的语法非常相似,无论哪种方式都没有多大优势,但是一旦你想开始执行其他操作(例如分组),pandas开始闪耀并且使用裸numpy变得越来越多不方便。