Массив Numpy со смешанными типами данных, выбрасывающий «недопустимый литерал для int () с основанием 10» для строки - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать массив смешанных типов с int и строкой, но получаю ошибку при заполнении строки.

a = np.full(2, np.nan, dtype='u4,S10'
a[0] = 1
a[1] = b'abc'

И это дает мне ошибку

ValueError: invalid literal for int() with base 10: b'abc'

Есть ли способ иметь массив смешанных типов, в который я могу поместить байтовые массивы вот так?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019
In [246]: a = np.full(2, np.nan, dtype='u4,S10')       

Посмотрите на полученный массив.Обратите внимание, что () делает 2 записи.Также обратите внимание, что np.nan (число с плавающей точкой) было преобразовано в другие значения в соответствии с указанным типом d (например, строка 'nan'):

In [247]: a                                                                                          
Out[247]: array([(0, b'nan'), (0, b'nan')], dtype=[('f0', '<u4'), ('f1', 'S10')])

Назначение 1 - изменение обоих элементов 1-й записи.Снова обратите внимание на строковое назначение:

In [248]: a[0] = 1                                                                                   
In [249]: a                                                                                          
Out[249]: array([(1, b'1'), (0, b'nan')], dtype=[('f0', '<u4'), ('f1', 'S10')])

Доступ по имени поля:

In [250]: a['f0']                                                                                    
Out[250]: array([1, 0], dtype=uint32)
In [251]: a['f1']                                                                                    
Out[251]: array([b'1', b'nan'], dtype='|S10')

Изменение элемента строкового поля:

In [252]: a['f1'][1] = b'abc'                                                                        
In [253]: a                                                                                          
Out[253]: array([(1, b'1'), (0, b'abc')], dtype=[('f0', '<u4'), ('f1', 'S10')])

Изменение обоих элементовзаписи - с кортежем:

In [254]: a[0] = (23, b'foobar')                                                                     
In [255]: a                                                                                          
Out[255]: 
array([(23, b'foobar'), ( 0, b'abc')],
      dtype=[('f0', '<u4'), ('f1', 'S10')])

Инициализация структурированного массива со списком кортежей:

In [256]: b = np.array([(2,b'xxx'),(34,b'xyz')], dtype=a.dtype)                                      
In [257]: b                                                                                          
Out[257]: array([( 2, b'xxx'), (34, b'xyz')], dtype=[('f0', '<u4'), ('f1', 'S10')])

Все это задокументировано:

https://docs.scipy.org/doc/numpy/user/basics.rec.html#assigning-data-to-a-structured-array

0 голосов
/ 25 июня 2019

Вы пытаетесь назначить целую строку.

Попробуйте:

a = np.full(2, np.nan, dtype='u4, S10')
a[0][0] = 1
a[0][1] = 'abc'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...