【问题标题】:Reshape 1-D Numpy Array to 2-D将一维 Numpy 数组重塑为二维
【发布时间】:2015-03-20 16:41:25
【问题描述】:

我有一个由 (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) 数组。

【问题讨论】:

  • 您的示例向量令人困惑(逗号/括号对我来说没有任何意义)。你能粘贴print(npArray)的实际输出吗?
  • 这看起来像一个结构化数组。 dtype 是什么?
  • @agomcas 这是合法的。括号显示在每个元组中,只有一个数组作为唯一元素,其中包含 x,y 坐标。不过很奇怪。
  • @hpaulj ive 已编辑以包含 dtype: dtype([('SHAPE@XY', '
  • @HuStmpHrrr 确实很奇怪。如果我尝试创建一个这样的数组,由于元组之间缺少逗号,我无法通过第一个元素。 (然后解释器假设我正在尝试 call tuple1(tuple2) )所以我猜这是某种奇怪的打印输出......

标签: python arrays numpy reshape


【解决方案1】:

文档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]])

【讨论】:

  • 感谢您的详尽解释!我确实从文档开始,但显然使用 npArray['SHAPE@XY'] 而不是 npArray 本身对我来说并不清楚。
【解决方案2】:

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

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

看起来您需要使用 npArray["SHAPE@XY"] 来访问 numpy 数组。该数组应该已经是所需的形状。

【讨论】:

  • 不,numpy.squeeze 不会影响原始数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2019-12-05
  • 2020-07-06
  • 2020-03-19
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多