将numpy 2D-array中的字符串元素转换为数组并生成3D数组

时间:2018-01-09 07:46:35

标签: python numpy multidimensional-array

我有一个形状为(3,2)的字符串的numpy二维数组:

ar_2d = array([['123', '456'],
               ['789', '0ab'],
               ['cde', 'fgh']],
              dtype='<U3')

为了方便起见,我确信每个字符串的长度相等。

我有一个函数,即split(),将字符串'123'设为python list ['1','2','3']

现在我想生成一个带有'123'到阵列array(['1', '2', '3'])的3D数组,最后我可以得到一个形状为(3,2,3)的3D数组:

ar_3d = array([[['1', '2', '3'],
                ['4', '5', '6']],

                [['7', '8', '9'],
                 ['0', 'a', 'b']],

                [['c', 'd', 'e'],
                 ['f', 'g', 'h']]],
               dtype='<U1')

我有一个想法,首先将字符串拆分为list,然后使用numpy的格式写入文件。然后,我将从文件中读取数组。

如果元素是整数,那会更容易吗?即号123以列出[1,2,3]

所以这就是问题,是否有一种优雅的方法来进行转换?

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用ndarray.view查看U1,然后重新塑造为3D -

In [15]: a
Out[15]: 
array([['123', '456'],
       ['789', '0ab'],
       ['cde', 'fgh']], 
      dtype='<U3')

In [16]: a.view('U1').reshape(a.shape + (-1,))
Out[16]: 
array([[['1', '2', '3'],
        ['4', '5', '6']],

       [['7', '8', '9'],
        ['0', 'a', 'b']],

       [['c', 'd', 'e'],
        ['f', 'g', 'h']]], 
      dtype='<U1')

输出只是输入的视图,因此这将是内存效率。因此,运行时将是恒定的(与阵列形状无关) -

In [20]: %timeit a.view('U1').reshape(a.shape + (-1,))
1000000 loops, best of 3: 828 ns per loop

In [21]: a_big = np.tile(a,10000)

In [22]: %timeit a_big.view('U1').reshape(a_big.shape + (-1,))
1000000 loops, best of 3: 851 ns per loop