将平面数组值转换为列向量

时间:2018-02-08 01:06:35

标签: python arrays numpy matrix

我有一个以字符串表示的基数为3的数组:

['1', '2', '10']

我希望0填充每个数字,使得每个数字占用的最大空间为3。

['001', '002', '010']

然后将其转换为以下矩阵:

[[0, 0, 0],
[0, 0, 1],
[1, 2, 0]]

即,将每个字符串条目转换为列向量。我尝试过旋转,转置,并且不确定最好的方法是什么。

由于

4 个答案:

答案 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]]