Не можете присвоить строковые элементы массиву NumPy? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать массив нулей и трехколоночных типов (целое число, число с плавающей запятой, символ). Справочный вопрос

Сомнение Почему dtype=S здесь создает двоичную строку?

arr = np.zeros((3,), dtype=('i4,f4,S'))
arr

>>array([[(0, 0., b''), (0, 0., b''), (0, 0., b'')]],
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', 'S')])

Issue Назначение символов не работает, вместо этого получаются пустые строки b''.

arr[:] = [(1, 2., 'A'),
               (2, 2., 'B'),
               (3, 3., 'C')]
arr

>>array([[(1, 2., b''), (2, 2., b''), (3, 3., b'')]],
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', 'S')])

Сомнение Почему проблема решается с помощью dtype='O' или dtype='a40' a python объекта?

x = np.zeros((3,), dtype=('i4,f4,O')) # same result goes with dtype='a40' 
new_data = [(1, 2., "A"), (2, 2., "B"), (3, 3., "C")]
x[:] = new_data
print(x)

>>[(1, 2., 'A') (2, 2., 'B') (3, 3., 'C')]

Чем a40 отличается от S, O и U dtypes для NumPy строковых элементов?

1 Ответ

1 голос
/ 08 марта 2020

Иногда S или str понимается как «достаточно длинная строка для хранения значений»:

In [389]: np.array('foobar', dtype='S')                                                        
Out[389]: array(b'foobar', dtype='|S6')
In [390]: np.array('foobar', dtype='str')                                                      
Out[390]: array('foobar', dtype='<U6')

Но составной тип d не является одним из них:

In [392]: np.array('foobar', dtype=[('x','S')])                                                
Out[392]: array((b'',), dtype=[('x', 'S')])
In [393]: np.array('foobar', dtype=[('x','S10')])                                              
Out[393]: array((b'foobar',), dtype=[('x', 'S10')])

'O' создает другой массив - один со списком, как ссылки на строки Python:

In [401]: np.array('foobar', 'O')                                                              
Out[401]: array('foobar', dtype=object)
In [405]: np.array('foobar', [('x','O')])                                                      
Out[405]: array(('foobar',), dtype=[('x', 'O')])
In [406]: np.array(b'foobar', [('x','O')])                                                     
Out[406]: array((b'foobar',), dtype=[('x', 'O')])
...