将1-D Numpy阵列重塑为2-D

时间:2015-03-20 16:41:26

标签: python arrays numpy reshape

我有一个由(doc here)创建的38(x,y)坐标的一维numpy数组:

npArray = arcpy.da.FeatureClassToNumPyArray(fc,["SHAPE@XY"])

这会输出一个(38,)数组,如:

[([X1, Y1],)
 ([X2, Y2],)
 ...
 ([X38, Y38],)]

编辑:以下是实际输出的前5行,以及dtype:

[([614276.776070848, 6086493.437772478],)
 ([626803.3576861953, 6101090.488548568],)
 ([627337.6049131282, 6100051.791447324],)
 ([627340.8526022129, 6099601.263191574],)
 ([629011.3422856168, 6099079.306533674],)

dtype([('SHAPE@XY', '<f8', (2,))])

但我想要一个(38,2)数组,如:

[(X1, Y1)
 (X2, Y2)
 ...
 (X38, Y38)]

我该如何实现?

我试过

numpy.reshape(npArray, (-1,2)) 

但是这会将坐标对重新调整为(19,2)数组。

2 个答案:

答案 0 :(得分:3)

文档http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000015000000表示它返回结构化数组。

由于dtype是:

dtype([('SHAPE@XY', '<f8', (2,))

您可以按名称

访问此field
npArray['SHAPE@XY']

结果应该是(38,2)数组。它将是原始版本的view


从头开始创建这样的结构化数组有点棘手,因为numpy尝试创建它可以创建的最高维数组。最可靠的方法是创建一个所需大小和dtype的空数组,然后逐字段分配值。

In [56]: X=np.zeros((5,),dtype=([('f0',int,(2,))]))
In [57]: X
Out[57]: 
array([([0, 0],), ([0, 0],), ([0, 0],), ([0, 0],), ([0, 0],)], 
      dtype=[('f0', '<i4', (2,))])
In [58]: X['f0']=np.arange(10).reshape(5,2)
In [59]: X
Out[59]: 
array([([0, 1],), ([2, 3],), ([4, 5],), ([6, 7],), ([8, 9],)], 
      dtype=[('f0', '<i4', (2,))])
In [60]: X['f0']
Out[60]: 
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])

答案 1 :(得分:1)

numpy.squeeze(numpy.array(npArray))有效吗?如果没有,你可以发布一个带数字的数组吗?

编辑:我没有使用arcpy(可能值得在问题中标记这个)但是来自这里的文档: http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000015000000

看起来您需要使用npArray [&#34; SHAPE @ XY&#34;]来访问numpy数组。然后,数组应该已经是所需的形状。