我有一个结构化网格。网格具有坐标(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数组
答案 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'。