Background... exploring the ArcGIS module and looking at how it worked which lead me to SpatialDataFrames, the cloaked version of a Pandas df with geometry stuff, which lead me to some of its inner workings etc etc.
I use Numpy and lot and the FeatureClassToNumPy array with some fancy array splitting generally satisfies all my needs to get the geometry yanked out of a featureclass... do the magic... then send it back to a featureclass.
I tend not to use searchcursors, but the ArcGIS code uses it in several places, so, I thought... give it a shot.
So... helper function ...
<SPAN class="keyword token">import</SPAN> sys
<SPAN class="keyword token">from</SPAN> textwrap <SPAN class="keyword token">import</SPAN> dedent
<SPAN class="keyword token">import</SPAN> numpy <SPAN class="keyword token">as</SPAN> np
<SPAN class="keyword token">import</SPAN> arcpy
<SPAN class="keyword token">from</SPAN> arcgis<SPAN class="punctuation token">.</SPAN>geometry <SPAN class="keyword token">import</SPAN> _types
<SPAN class="keyword token">from</SPAN> arcgis<SPAN class="punctuation token">.</SPAN>features<SPAN class="punctuation token">.</SPAN>_data<SPAN class="punctuation token">.</SPAN>geodataset <SPAN class="keyword token">import</SPAN> SpatialDataFrame <SPAN class="keyword token">as</SPAN> SDF
<SPAN class="keyword token">import</SPAN> pandas <SPAN class="keyword token">as</SPAN> pd
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">fc_info</SPAN><SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""Return basic featureclass information, including...
: SR - spatial reference object (use SR.name to get the name)
: shp_fld - field name which contains the geometry object
: oid_fld - the object index/id field name
: - others: 'areaFieldName', 'baseName', 'catalogPath','featureType',
: 'fields', 'hasOID', 'hasM', 'hasZ', 'path'
: - all_flds =[i.name for i in desc['fields']]
"""</SPAN>
desc <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>Describe<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">)</SPAN>
args <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'shapeFieldName'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'OIDFieldName'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'spatialReference'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'shapeType'</SPAN><SPAN class="punctuation token">]</SPAN>
shp_fld<SPAN class="punctuation token">,</SPAN> oid_fld<SPAN class="punctuation token">,</SPAN> SR<SPAN class="punctuation token">,</SPAN> shp_type <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>desc<SPAN class="punctuation token">[</SPAN>i<SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> args<SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">return</SPAN> shp_fld<SPAN class="punctuation token">,</SPAN> oid_fld<SPAN class="punctuation token">,</SPAN> SR<SPAN class="punctuation token">,</SPAN> shp_type<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
@time_deco
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">to_arr</SPAN><SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">,</SPAN> use_geo<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""Convert a featureclass to a structured or recarray using a searchcursor.
:
:Requires: import arcpy, numpy as np
:--------
: in_fc - featureclass
: use_geo - True .__geo_interface__
: - list comprehension
:get the row information
: cycle through all geometries and get xy pairs
:
:References:
:----------
: - see the polygon, polyline etc classes in
: C:\ArcPro\Resources\ArcPy\arcpy\arcobjects\geometry.py
"""</SPAN>
shp_fld<SPAN class="punctuation token">,</SPAN> oid_fld<SPAN class="punctuation token">,</SPAN> SR<SPAN class="punctuation token">,</SPAN> shp_type <SPAN class="operator token">=</SPAN> fc_info<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># get the base information</SPAN>
flds <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">)</SPAN>
fnames <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>f<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> flds <SPAN class="keyword token">if</SPAN> f<SPAN class="punctuation token">.</SPAN>type <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'OID'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'Geometry'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
geom_flds <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'SHAPE@'</SPAN><SPAN class="punctuation token">,</SPAN> oid_fld<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">+</SPAN> fnames
flds <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>shp_fld<SPAN class="punctuation token">,</SPAN> oid_fld<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">+</SPAN> fnames
vals <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
geoms <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
coords <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
idx <SPAN class="operator token">=</SPAN> flds<SPAN class="punctuation token">.</SPAN>index<SPAN class="punctuation token">(</SPAN>shp_fld<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">,</SPAN>
field_names<SPAN class="operator token">=</SPAN>geom_flds<SPAN class="punctuation token">,</SPAN> where_clause<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN>
spatial_reference<SPAN class="operator token">=</SPAN>SR<SPAN class="punctuation token">,</SPAN> explode_to_points<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">,</SPAN>
sql_clause<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">(</SPAN>None<SPAN class="punctuation token">,</SPAN> None<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> rows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> rows<SPAN class="punctuation token">:</SPAN>
row <SPAN class="operator token">=</SPAN> list<SPAN class="punctuation token">(</SPAN>row<SPAN class="punctuation token">)</SPAN>
geom <SPAN class="operator token">=</SPAN> row<SPAN class="punctuation token">.</SPAN>pop<SPAN class="punctuation token">(</SPAN>idx<SPAN class="punctuation token">)</SPAN>
vals<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>row<SPAN class="punctuation token">)</SPAN>
geoms<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>geom<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># pop the geometry out</SPAN>
<SPAN class="keyword token">if</SPAN> use_geo<SPAN class="punctuation token">:</SPAN>
xy <SPAN class="operator token">=</SPAN> geom<SPAN class="punctuation token">.</SPAN>__geo_interface__<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'coordinates'</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
xy <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN>pt<SPAN class="punctuation token">.</SPAN>X<SPAN class="punctuation token">,</SPAN> pt<SPAN class="punctuation token">.</SPAN>Y<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">for</SPAN> pt <SPAN class="keyword token">in</SPAN> arr <SPAN class="keyword token">if</SPAN> pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> arr <SPAN class="keyword token">in</SPAN> geom<SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># if pt else None</SPAN>
coords<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>asarray<SPAN class="punctuation token">(</SPAN>xy<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># maybe dump the last as np.asarray</SPAN>
<SPAN class="keyword token">del</SPAN> row<SPAN class="punctuation token">,</SPAN> geom<SPAN class="punctuation token">,</SPAN> xy
<SPAN class="keyword token">del</SPAN> rows
<SPAN class="keyword token">return</SPAN> vals<SPAN class="punctuation token">,</SPAN> coords<SPAN class="punctuation token">,</SPAN> geoms<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Now on to the next '2'
<SPAN class="comment token">#@time_deco</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">two_arrays</SPAN><SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">,</SPAN> keep_geom<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN> dtype0<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN> as_recarray<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""Send to a numpy structured/array and split it into a geometry array
: and an attribute array.
:
:Requires:
:--------
: fc_info(in_fc) - function needed to return fc properties
: keep_geom
: - True, split the points into their geometry groups as an object array
: - False, a sequential array of shape = (N,)
: dtype0
: - True dt = [('Idx', '<i4'), ('Xs', '<f8'), ('Ys', '<f8')]
: - False dt = [('Idx', '<i4'), ('XY', '<f8', (2,))]
"""</SPAN>
shp_fld<SPAN class="punctuation token">,</SPAN> oid_fld<SPAN class="punctuation token">,</SPAN> SR<SPAN class="punctuation token">,</SPAN> shp_type <SPAN class="operator token">=</SPAN> fc_info<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">)</SPAN>
all_flds <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">)</SPAN>
b_flds <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>i<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> all_flds<SPAN class="punctuation token">]</SPAN>
a <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>FeatureClassToNumPyArray<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">,</SPAN>
field_names<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN>oid_fld<SPAN class="punctuation token">,</SPAN> shp_fld<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>
explode_to_points<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">,</SPAN>
spatial_reference<SPAN class="operator token">=</SPAN>SR<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> dtype0<SPAN class="punctuation token">:</SPAN>
dt <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Idx'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<i4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Xs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Ys'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># option 1</SPAN>
dtb <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Idx'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<i4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Xc'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Yc'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
dt <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Idx'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<i4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'XY'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
dtb <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Idx'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<i4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'XYc'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
a<SPAN class="punctuation token">.</SPAN>dtype <SPAN class="operator token">=</SPAN> dt
oid_fld <SPAN class="operator token">=</SPAN> <SPAN class="string token">'Idx'</SPAN>
<SPAN class="keyword token">if</SPAN> keep_geom<SPAN class="punctuation token">:</SPAN>
a <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>split<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> np<SPAN class="punctuation token">.</SPAN>where<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>diff<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">[</SPAN>oid_fld<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># oid_fld</SPAN>
a <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>r_<SPAN class="punctuation token">[</SPAN>a<SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">if</SPAN> as_recarray<SPAN class="punctuation token">:</SPAN>
a <SPAN class="operator token">=</SPAN> a<SPAN class="punctuation token">.</SPAN>view<SPAN class="punctuation token">(</SPAN>object<SPAN class="punctuation token">,</SPAN> np<SPAN class="punctuation token">.</SPAN>recarray<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#</SPAN>
<SPAN class="comment token">#</SPAN>
b <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>FeatureClassToNumPyArray<SPAN class="punctuation token">(</SPAN>in_fc<SPAN class="punctuation token">,</SPAN> field_names<SPAN class="operator token">=</SPAN>b_flds<SPAN class="punctuation token">,</SPAN>
explode_to_points<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">,</SPAN>
spatial_reference<SPAN class="operator token">=</SPAN>SR<SPAN class="punctuation token">)</SPAN>
dtb<SPAN class="punctuation token">.</SPAN>extend<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">.</SPAN>dtype<SPAN class="punctuation token">.</SPAN>descr<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
b<SPAN class="punctuation token">.</SPAN>dtype <SPAN class="operator token">=</SPAN> dtb
<SPAN class="keyword token">return</SPAN> a<SPAN class="punctuation token">,</SPAN> b<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>Now testing on trivial samples is trivial. Before I moved on to big samples (geometries with millions of points), I tried it on a suitable one that was readily available...
<SPAN class="comment token"># ---- A multipart polygon file, with 3 parts and 0, 1 or 2 subparts</SPAN>
a<SPAN class="punctuation token">.</SPAN>size <SPAN class="comment token"># = 3</SPAN>
a<SPAN class="punctuation token">.</SPAN>shape <SPAN class="comment token"># = (3,)</SPAN>
sum<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN>i<SPAN class="punctuation token">.</SPAN>size <SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> a<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># = 1,814,562 points</SPAN>
<SPAN class="comment token"># ---- Big snips because of array print options -----</SPAN>
array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN> array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">65.55527496337874</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">49.25722122192411</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">65.55305480957014</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">49.25694274902389</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="comment token"># big snip</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">55.902732849121094</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">51.63003158569353</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">55.90134429931635</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">51.63085556030313</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>
dtype<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Idx'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<i4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Xs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Ys'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">81.8187484741211</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">68.89791870117205</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">81.81718444824207</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">68.89531707763712</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="comment token"># other snip</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">99.49025726318348</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">51.53623199462936</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">99.49021148681629</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">51.536178588867415</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>
dtype<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Idx'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<i4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Xs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Ys'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">114.51197814941384</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">73.37343597412138</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">114.5083312988279</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">73.37291717529314</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="comment token"># and another</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">69.89323425292969</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">83.10884857177757</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">(</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">69.89251708984364</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">83.10861206054705</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>
dtype<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Idx'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<i4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Xs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Ys'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'<f8'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> dtype<SPAN class="operator token">=</SPAN>object<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># ---- again, 1.8 ish million points ----</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Timing results
Timing function for... to_arr
Time: 4.63e+01s for 3 objects # 46 seconds
_ = two_arrays(in_fc)
Timing function for... two_arrays
Time: 4.45e+00s for 2 objects # 4.5 seconds
I kept the scripts intact for people to try out on their data. I even went as far as to strip out anything unnecessary in other versions but nothing reduced the time of the searchcursor approach. I am trying to get a handle on 'why'. I would have guessed that a similar base code would have been recycled in the searchcursor and the FeatureClassToNumPyArray functionality. I guess I am wrong OR there is some fundamental flaw in my implementation of 'to_arr' vs 'two_arrays'... so if you have a moment or two... have a look-see
Dan