将一维 Numpy 数组重塑为二维
Reshape 1-D Numpy Array to 2-D
我有一个由 (doc here) 创建的 38 (x,y) 坐标的一维 numpy 数组:
npArray = arcpy.da.FeatureClassToNumPyArray(fc,["SHAPE@XY"])
这会输出一个 (38,) 数组,例如:
[([X1, Y1],)
([X2, Y2],)
...
([X38, Y38],)]
edit:这是实际输出的前 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) 数组。
numpy.squeeze(numpy.array(npArray)) 有效吗?如果没有,你能post一个数组吗?
编辑:我没有使用 arcpy(可能值得在问题中标记它)但是来自这里的文档:
http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000015000000
看来您需要使用 npArray["SHAPE@XY"] 来访问 numpy 数组。该阵列应该已经是所需的形状。
文档 http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000015000000 说它是 returns 结构化数组。
因为 dtype
是:
dtype([('SHAPE@XY', '<f8', (2,))
您可以通过名称访问此 field
npArray['SHAPE@XY']
结果应该是一个 (38,2)
数组。这将是一个 view
在原来的基础上。
从头开始创建这样的结构化数组有点棘手,因为 numpy
会尝试尽可能创建最高维度的数组。最可靠的方法是创建一个具有所需大小和数据类型的空数组,然后逐个字段赋值。
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]])
我有一个由 (doc here) 创建的 38 (x,y) 坐标的一维 numpy 数组:
npArray = arcpy.da.FeatureClassToNumPyArray(fc,["SHAPE@XY"])
这会输出一个 (38,) 数组,例如:
[([X1, Y1],)
([X2, Y2],)
...
([X38, Y38],)]
edit:这是实际输出的前 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) 数组。
numpy.squeeze(numpy.array(npArray)) 有效吗?如果没有,你能post一个数组吗?
编辑:我没有使用 arcpy(可能值得在问题中标记它)但是来自这里的文档: http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000015000000
看来您需要使用 npArray["SHAPE@XY"] 来访问 numpy 数组。该阵列应该已经是所需的形状。
文档 http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000015000000 说它是 returns 结构化数组。
因为 dtype
是:
dtype([('SHAPE@XY', '<f8', (2,))
您可以通过名称访问此 field
npArray['SHAPE@XY']
结果应该是一个 (38,2)
数组。这将是一个 view
在原来的基础上。
从头开始创建这样的结构化数组有点棘手,因为 numpy
会尝试尽可能创建最高维度的数组。最可靠的方法是创建一个具有所需大小和数据类型的空数组,然后逐个字段赋值。
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]])