Как установить запись в массиве Numpy на 0 или None, если записи сами являются структурированными массивами? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть список объектов, которые являются структурированными массивами, например, что-то вроде этого:

a = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)], dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
b = np.array([('Dog3', 9, 81.0), ('Dog4', 3, 27.0)], dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
c = np.array([('Dog5', 9, 81.0), ('Dog6', 3, 27.0)], dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])

lst = [a, b, c]

Теперь мне нужно, чтобы этот список был сам по себе массив, потому что мне нужно использовать numpy.where() на неми это не работает иначе.

lst = np.array(lst)

Итак, я делаю что-то вроде этого:

ID = np.where(lst == c)
lst[ID] = 0 or rather lst[ID] = None

Но вместо того, что я хотел бы получить, т.е.

>>>lst
array([a, b, 0/None], dtype=...)

, я либо получаю это:

>>>lst
array([a, b, [('0', 0,  0.), ('0', 0,  0.)]], dtype=...)

Или это вообще не работает:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

Как мне это сделать?Нужно ли конвертировать lst обратно в список?

1 Ответ

1 голос
/ 14 июня 2019

Давайте создадим более простой массив и попробуем установить несколько значений:

In [14]: dt = np.dtype([('foo','U10'),('bar',int)])                             
In [16]: arr = np.zeros(3, dtype=dt)                                            
In [17]: arr                                                                    
Out[17]: array([('', 0), ('', 0), ('', 0)], dtype=[('foo', '<U10'), ('bar', '<i8')])
In [18]: arr[1]                                                                 
Out[18]: ('', 0)
In [19]: arr[1] = 12                                                            
In [20]: arr                                                                    
Out[20]: 
array([('',  0), ('12', 12), ('',  0)],
      dtype=[('foo', '<U10'), ('bar', '<i8')])  

обратите внимание на сочетание строки '12' и целого числа 12.

Установить с кортежем, одно значениедля каждого поля:

In [21]: arr[2] = ('dog',23)                                                    

установить с None не удается, потому что он не может преобразовать None в целое число, как того требует 2-е поле.

In [22]: arr[0] = None                                                          
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-2f7a4c897706> in <module>
----> 1 arr[0] = None

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
In [23]: arr                                                                    
Out[23]: 
array([('None',  0), ('12', 12), ('dog', 23)],
      dtype=[('foo', '<U10'), ('bar', '<i8')])

На самом деле этоудалось установить строковое поле.

arr - это массив, в котором каждый элемент должен иметь одинаковый dtype.

Массив с object dtype ведет себя больше как список.Хотя это иногда полезно, его не следует использовать в качестве замены списков.

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