将字符串字典转换为numpy数组

时间:2018-05-03 10:27:05

标签: python arrays string python-3.x numpy

我必须更改一个字符串字典,看起来像这样。

result = {'top-L': ' ', 'top-M': ' ', 'top-R': ' ',
          'mid-L': ' ', 'mid-M': ' ', 'mid-R': ' ',
          'low-L': ' ', 'low-M': ' ', 'low-R': ' '}

现在,我必须将其转换为3x3阵列。

所以,到目前为止,我已经达到了一个几乎可以达到预期效果的代码,但仍然很混乱。

这是代码。

import numpy as np
names = ['left','middle']
formats = ['S3','S3']
dtype = dict(names = names, formats=formats)
array = np.fromiter(result.items(), dtype=dtype, count=len(result))
arr = np.reshape(array, (3,3))
print(repr(arr))
print (arr[0][1]) 

和生成的输出。

array('lo[[(b'top', b' '), (b'top', b' '), (b'top', b' ')],
       [(b'mid', b' '), (b'mid', b' '), (b'mid', b' ')],
       [(b'low', b' '), (b'low', b' '), (bw', b' ')]],
      dtype=[('left', 'S3'), ('middle', 'S3')])
(b'top', b' ')

注意print (arr[0][1])生成(b'top', b' '),这是不期望的。

此代码可能有问题,任何建议。

1 个答案:

答案 0 :(得分:1)

首先需要考虑的是,较低版本的Python-3.7中的字典不保留其项目的顺序。因此,如果您使用其中一个版本,则不得期望获得预期订单的结果。

通过这种说法,通常,在Numpy数组中保留字符串项的非常优化和方便的方法是使用numpy.chararray()个对象。正如documentation chararray中提到的那样,它提供了对字符串和unicode值数组的方便视图。

以下是使用chararray获取预期数组的方法:

>>> items = list(result.items())
# By passing `itemsize=5` to the chararray function you're specifying
# the length of each array item
>>> arr = np.chararray((len(items), 2), itemsize=5)
>>> arr[:] = items
>>> arr
chararray([[b'top-L', ''],
           [b'top-M', ''],
           [b'top-R', ''],
           [b'mid-L', ''],
           [b'mid-M', ''],
           [b'mid-R', ''],
           [b'low-L', ''],
           [b'low-M', ''],
           [b'low-R', '']], dtype='|S5')
>>> arr[0]
chararray([b'top-L', ''], dtype='|S5')
>>> arr[0][1]
''

此代码已在Python-3.7交互式shell环境中运行,这就是为什么数组的顺序与字典的项目顺序相同。