我必须更改一个字符串字典,看起来像这样。
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' ')
,这是不期望的。
此代码可能有问题,任何建议。
答案 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环境中运行,这就是为什么数组的顺序与字典的项目顺序相同。