我有一个形状为(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]
所以这就是问题,是否有一种优雅的方法来进行转换?
提前致谢!
答案 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