Python Numpy, как искать строку в одномерном массиве с несколькими типами данных - PullRequest
1 голос
/ 22 марта 2019

Очень просто:

У меня есть массив:

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)

Какой самый быстрый способ сделать это?

Ответы [ 2 ]

0 голосов
/ 22 марта 2019
In [501]: users = numpy.empty(10, "U25, int16, int16, int16")                             
In [503]: users['f0'][1]='Jim' 

Вы можете протестировать поле так же, как и обычный 1d-массив:

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

Тестирование их на кортежи даст предупреждение о будущем.

0 голосов
/ 22 марта 2019

У вас есть обычный одномерный массив кортежей. Вы можете получить «строку» так же, как со списками 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...