我正在尝试创建一个由零和三列类型(整数,浮点数,字符)组成的数组。 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字符串元素,a40
与S
,O
和U
dtypes
有何不同?
答案 0 :(得分:1)
有时将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')
但是复合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')])