我有一个以字符串表示的基数为3的数组:
['1', '2', '10']
我希望0填充每个数字,使得每个数字占用的最大空间为3。
['001', '002', '010']
然后将其转换为以下矩阵:
[[0, 0, 0],
[0, 0, 1],
[1, 2, 0]]
即,将每个字符串条目转换为列向量。我尝试过旋转,转置,并且不确定最好的方法是什么。
由于
答案 0 :(得分:3)
这是一种方式。我没有分开中间步骤,但这很容易完成。
lst = ['1', '2', '10']
result = list(zip(*(map(int, i.zfill(3)) for i in lst)))
如果你想要一个numpy
数组:
import numpy as np
arr = np.array(result)
# array([[0, 0, 0],
# [0, 0, 1],
# [1, 2, 0]])
答案 1 :(得分:3)
使用str.zfill
填充零,然后np.dstack
转换预期格式:
In [106]: np.dstack([list(i.zfill(3)) for i in a])[0].astype(np.int)
Out[106]:
array([[0, 0, 0],
[0, 0, 1],
[1, 2, 0]])
答案 2 :(得分:1)
您可以使用numpy.char
模块,该模块提供许多字符串操作的矢量化版本:
>>> import numpy as np
>>>
>>> a = np.array((1,2,10),'U2')
>>> a
array(['1', '2', '10'],
dtype='<U2')
>>>
>>> b = np.char.zfill(a, 3)
>>> b
array(['001', '002', '010'],
dtype='<U3')
>>>
>>> c = b.view('U1').reshape(3, 3).T.astype(int)
>>> c
array([[0, 0, 0],
[0, 0, 1],
[1, 2, 0]])
答案 3 :(得分:0)
尝试以下代码。解释被添加为注释:
lst = ['1', '2', '10'] # input list
outlist = [] # empty output list
for i in lst:
while len(i) <3:
i = '0'+i # add leading 0s
outlist.append(list(i)) # string converted to list and added to output list
# convert to np.array, then to integers, transpose and convert back to list:
outlist = np.array(outlist).astype(np.int).T.tolist()
print(outlist)
输出:
[[0, 0, 0], [0, 0, 1], [1, 2, 0]]