Faster/simpler cumsum approach in read_point_list
Reqires a special case for ndarrays in dedup_field() -- probably a good idea anyways if user gives us an ndarray
This commit is contained in:
parent
e046af8ce8
commit
6f2200c5ed
@ -1345,10 +1345,7 @@ def read_point_list(stream: io.BufferedIOBase) -> List[List[int]]:
|
|||||||
elif list_type == 5:
|
elif list_type == 5:
|
||||||
deltas = [Delta.read(stream).as_list() for _ in range(list_len)]
|
deltas = [Delta.read(stream).as_list() for _ in range(list_len)]
|
||||||
if _USE_NUMPY:
|
if _USE_NUMPY:
|
||||||
delta_x, delta_y = zip(*deltas)
|
points = numpy.cumsum(deltas, axis=0)
|
||||||
x = numpy.cumsum(delta_x)
|
|
||||||
y = numpy.cumsum(delta_y)
|
|
||||||
points = list(zip(x, y))
|
|
||||||
else:
|
else:
|
||||||
points = []
|
points = []
|
||||||
x = 0
|
x = 0
|
||||||
|
@ -24,7 +24,10 @@ from .basic import AString, NString, repetition_t, property_value_t, real_t, \
|
|||||||
read_bstring, read_uint, read_sint, read_real, read_repetition, read_interval, \
|
read_bstring, read_uint, read_sint, read_real, read_repetition, read_interval, \
|
||||||
write_bstring, write_uint, write_sint, write_real, write_interval, write_point_list, \
|
write_bstring, write_uint, write_sint, write_real, write_interval, write_point_list, \
|
||||||
write_property_value, read_bool_byte, write_bool_byte, read_byte, write_byte, \
|
write_property_value, read_bool_byte, write_bool_byte, read_byte, write_byte, \
|
||||||
InvalidDataError, PathExtensionScheme
|
InvalidDataError, PathExtensionScheme, _USE_NUMPY
|
||||||
|
|
||||||
|
if _USE_NUMPY:
|
||||||
|
import numpy
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -2444,7 +2447,12 @@ def dedup_field(record: Record, r_field: str, modals: Modals, m_field: str):
|
|||||||
r = getattr(record, r_field)
|
r = getattr(record, r_field)
|
||||||
m = getattr(modals, m_field)
|
m = getattr(modals, m_field)
|
||||||
if r is not None:
|
if r is not None:
|
||||||
if m is not None and m == r:
|
if _USE_NUMPY and m_field in ('polygon_point_list', 'path_point_list'):
|
||||||
|
equal = numpy.array_equal(m, r)
|
||||||
|
else:
|
||||||
|
equal = m is not None and m == r
|
||||||
|
|
||||||
|
if equal:
|
||||||
setattr(record, r_field, None)
|
setattr(record, r_field, None)
|
||||||
else:
|
else:
|
||||||
setattr(modals, m_field, r)
|
setattr(modals, m_field, r)
|
||||||
|
Loading…
Reference in New Issue
Block a user