【问题标题】:Python Numpy how to search for a row in a one dimensional array with multiple datatypesPython Numpy如何在具有多种数据类型的一维数组中搜索一行
【发布时间】:2019-08-12 20:55:36
【问题描述】:

很简单:

我有一个数组:

users = numpy.empty(10000, "U25, int16, int16, int16")

print(users)
[('', 0, 0, 0) ('Jim', 0, 0, 0) ('', 0, 0, 0) ..., ('', 0, 0, 0) ('', 0, 0, 0)
 ('', 0, 0, 0)]

我想返回包含字符串“Jim”的行,也就是索引为 2 的行:

('Jim', 0, 0, 0)

最快的方法是什么?

【问题讨论】:

  • 您的数组是一维的,这意味着您打印 users.shape 将返回 (10000,)
  • 一维数组中的一行是什么概念?你怎么知道字符串'Jim' 包含在一个未初始化的空数组中?
  • 测试数组必须有一个匹配的数据类型。 np.array(('Jim',0,0,0), dtype=users.dtype).
  • 也可以搜索users['f0'],一维字符串dtype数组。

标签: python numpy search rows


【解决方案1】:

你有一个普通的一维元组数组。您可以像使用 Python 列表一样获取“行”:

users[1]

In [22]: users = np.empty(10000, "U25, int16, int16, int16")

In [26]: users[1][0] = "Jim"

In [28]: users
Out[28]: 
array([('', 0, 0, 0), ('Jim', 0, 0, 0), ('', 0, 0, 0), ..., ('', 0, 0, 0),
       ('', 0, 0, 0), ('', 0, 0, 0)],
      dtype=[('f0', '<U25'), ('f1', '<i2'), ('f2', '<i2'), ('f3', '<i2')])

In [29]: users[1]
Out[29]: ('Jim', 0, 0, 0)

【讨论】:

  • users[1]typenp.void,而不是 tuple。它显示为一个元组,users[1].tolist() 是一个元组。
【解决方案2】:
In [501]: users = numpy.empty(10, "U25, int16, int16, int16")                             
In [503]: users['f0'][1]='Jim' 

您可以像测试常规一维数组一样测试字段:

In [504]: users['f0']=='Jim'                                                              
Out[504]: 
array([False,  True, False, False, False, False, False, False, False,
       False])
In [505]: np.where(_)                                                                     
Out[505]: (array([1]),)

但是要测试整个记录,您必须使用相同 dtype 的测试数组:

In [506]: test = np.array(('Jim',0,0,0),dtype=users.dtype)                                
In [507]: test                                                                            
Out[507]: 
array(('Jim', 0, 0, 0),
      dtype=[('f0', '<U25'), ('f1', '<i2'), ('f2', '<i2'), ('f3', '<i2')])
In [508]: users==test                                                                     
Out[508]: 
array([False,  True, False, False, False, False, False, False, False,
       False])

元素(记录)显示为元组,但不是

In [511]: type(users[1])                                                                  
Out[511]: numpy.void
In [512]: type(users[1].tolist())                                                         
Out[512]: tuple

针对元组测试它们会发出 FutureWarning。

【讨论】:

  • 嗨,伙计,我如何直接返回正确的行(通过将测试数组与用户进行比较),而不是执行 users==test 来获取 bool 数组。
  • 其实不用担心这个是我自己想出来的:originalRow = users[(users[:]['f0'] == "Jim")]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2020-03-25
  • 2013-08-04
  • 2021-06-22
  • 2015-04-01
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多