制作字符串的二维矩阵以匹配网格坐标

时间:2016-08-01 10:28:51

标签: python arrays pandas numpy

我有一个结构化网格。网格具有坐标(X,Y),但每个网格单元也分配了一个字母数字代码。 网格X和Y坐标生成为带有meshgrid的2D数组。

带有字母数字代码的系列看起来像这样

Index   Code
0       aa1
1       aa2
2       aa3
3       aa4
4       bb1
5       bb2
6       bb3
7       bb4
8       ab1
9       ab2
10      ab3
11      ab4
....    .....

我的想法是制作一个字母数字代码的二维数组,以便每个元素的行和列索引对应于X和Y二维数组的相同行和列索引。

字母数字值是在与X和Y 2D阵列的大小相同长度的熊猫系列中。我需要每隔第n个元素切片字母数字值(例如,取0到2并将其作为第一行)并形成2D数组的第一行,并继续填充其余部分。

最后我想要这个:

0     0           1         2
1     aa1         aa2       aa3        
2     aa4         bb1       bb2
3     bb3         bb4       ab1
4     ab2         ab3       ab4
.....................

有关如何使这项工作的任何建议? 我设法得到了这个:

interval = 2
alphanum = [array[i:i+interval] for i in range(len(df.series))[::interval]]

它给出了一个系列列表而不是2D数组

2 个答案:

答案 0 :(得分:1)

您可以使用numpy.array_split甚至numpy.split将阵列拆分为多个子阵列。但如果不能进行平等分割,前者不会引发异常。

In [2]: np.array(np.array_split(df['Code'].values, 4))
Out[2]: 
array([['aa1', 'aa2', 'aa3'],
       ['aa4', 'bb1', 'bb2'],
       ['bb3', 'bb4', 'ab1'],
       ['ab2', 'ab3', 'ab4']], dtype=object)

编辑:

你的意思是这样吗?

In [5]: np.array(np.array_split(df.as_matrix(columns=['Code']), 4))
Out[5]: 
array([[['aa1'],
        ['aa2'],
        ['aa3']],

       [['aa4'],
        ['bb1'],
        ['bb2']],

       [['bb3'],
        ['bb4'],
        ['ab1']],

       [['ab2'],
        ['ab3'],
        ['ab4']]], dtype=object)

答案 1 :(得分:0)

好吧,如果您知道每行的长度,您只能使用一个列表。 您可以在“头部”中创建2D数组,并将坐标转换为数组中的位置。

示例

你有一个row_length x column_length网格,因此你有一个包含row_length * column_length条目的列表。 要访问特定坐标,请访问列表的以下条目:

Pos(x|y) = mygrid[xcoord*rowlength+columnlength]


<强>解释/澄清

您可以使用1D列表,而不是使用实际的2D数组。如果您知道每行的大小,那不是问题,而是提高程序使用的速度。假设我们在每个位置都有一个包含字母的3x3网格,我们的坐标看起来像:(0 | 0,0 | 1,0 | 2,1 | 0,1 | 1,...)

我们可以用以下代码表示这个网格:

      0          1         2

0    'a'        'q'       'x'

1    'm'        'f'       'b'  

2    'l'        's'       'r' 

或者,我们不是创建一个实际的2D网格,而是创建一维数组。

data = ['a', 'q', 'x', 'm', 'f', 'b', 'l', 's', 'r']

要获取特定坐标的索引,我们现在可以将row_number与每行的长度相乘,并将column_number添加到其中。

例如,要访问上面网格的坐标(2 | 1),我们只需访问:

data[2*3+1]

如果你检查这两个值,你会发现它们都正在传递字母's'。