块数据转换为3D数组

时间:2017-08-19 13:15:35

标签: python arrays numpy

我只是python的初学者,所以我问这个问题。我有一个像

这样的数据文件
0.00 0.00    0.00  0.00   0.00 1.20
0.00 0.00    0.02  7.00   0.00 3.20

1.00 0.00    4.00  5.00   0.00 3.20
2.00 3.00    0.02  0.00   0.00 4.20

.........。

我需要将此数据转换为数组A [i,j,k]。 i是具有四个数字的一​​个块的索引。增加的是从左到右。在这种情况下,i = 0,1,2,3,4,5。 j是字符串的索引。在这种情况下,j = 0,1。 k索引是一个块中的列,k = 0,1。为了进一步说明,A [1,1,1] = 7.00。我怎么能用numpy或scipy来做呢?

1 个答案:

答案 0 :(得分:0)

使用numpy.reshapeswapaxes

import numpy as np

arr = np.array([[ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.2 ],
                [ 0.  ,  0.  ,  0.02,  7.  ,  0.  ,  3.2 ],
                [ 1.  ,  0.  ,  4.  ,  5.  ,  0.  ,  3.2 ],
                [ 2.  ,  3.  ,  0.02,  0.  ,  0.  ,  4.2 ]])

arr.reshape(-1,2,3,2).swapaxes(2,1).reshape(-1,2,2)    
#array([[[ 0.  ,  0.  ],
#        [ 0.  ,  0.  ]],

#       [[ 0.  ,  0.  ],
#        [ 0.02,  7.  ]],

#       [[ 0.  ,  1.2 ],
#        [ 0.  ,  3.2 ]],

#       [[ 1.  ,  0.  ],
#        [ 2.  ,  3.  ]],

#       [[ 4.  ,  5.  ],
#        [ 0.02,  0.  ]],

#       [[ 0.  ,  3.2 ],
#        [ 0.  ,  4.2 ]]])

更具程序性:

# target array shape
t_shape = (6, 2, 2)
assert arr.shape[1]%t_shape[2] == 0
arr.reshape(-1, t_shape[1], arr.shape[1]/t_shape[2], t_shape[2]).swapaxes(2,1).reshape(t_shape)

将字符串加载为数组:

from io import BytesIO  # for python 2
# from io import StringIO for python 3
arr = np.genfromtxt(BytesIO("""0.00 0.00    0.00  0.00   0.00 1.20
0.00 0.00    0.02  7.00   0.00 3.20
1.00 0.00    4.00  5.00   0.00 3.20
2.00 3.00    0.02  0.00   0.00 4.20"""))