无法将字符串元素分配给NumPy数组?

时间:2020-03-08 16:38:14

标签: python numpy dtype

我正在尝试创建一个由零和三列类型(整数,浮点数,字符)组成的数组。 Reference question

怀疑
为什么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')])

问题
字符分配无效,而是产生空白字符串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'一个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')]

对于NumPy字符串元素,a40SOU dtypes有何不同?

1 个答案:

答案 0 :(得分:1)

有时将Sstr理解为“足够长的字符串来容纳值”:

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')

但是复合dtype不是其中之一:

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')])