diff options
author | Eric Wieser <wieser.eric@gmail.com> | 2017-05-05 11:40:23 +0100 |
---|---|---|
committer | Eric Wieser <wieser.eric@gmail.com> | 2017-05-05 12:00:30 +0100 |
commit | fed2e1a4304123f8a0cc4313cae9ffe3d6614b78 (patch) | |
tree | d8174793617ecd573573f7f26e3796f0d21551c7 /numpy/core/_internal.py | |
parent | 7f6c95fe1d3873fae6b83530e9ee7a3f5f357504 (diff) | |
download | numpy-fed2e1a4304123f8a0cc4313cae9ffe3d6614b78.tar.gz |
ENH: Pad with itemsize, not padding fields
Adding padding fields means that dtypes with the same fields cannot necessarily
be cast to one another. Padding shouldn't prevent casting.
Partially fixes #9053
Diffstat (limited to 'numpy/core/_internal.py')
-rw-r--r-- | numpy/core/_internal.py | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/numpy/core/_internal.py b/numpy/core/_internal.py index 84261f3ee..23df0a7ad 100644 --- a/numpy/core/_internal.py +++ b/numpy/core/_internal.py @@ -619,33 +619,24 @@ def __dtype_from_pep3118(stream, is_subdtype): def _add_trailing_padding(value, padding): """Inject the specified number of padding bytes at the end of a dtype""" if value.fields is None: - vfields = {'f0': (value, 0)} + field_spec = dict( + names=['f0'], + formats=[value], + offsets=[0], + itemsize=value.itemsize + ) else: - vfields = dict(value.fields) - - if (value.names and value.names[-1] == '' and - value[''].char == 'V'): - # A trailing padding field is already present - vfields[''] = ('V%d' % (vfields[''][0].itemsize + padding), - vfields[''][1]) - value = dtype(vfields) - else: - # Get a free name for the padding field - j = 0 - while True: - name = 'pad%d' % j - if name not in vfields: - vfields[name] = ('V%d' % padding, value.itemsize) - break - j += 1 - - value = dtype(vfields) - if '' not in vfields: - # Strip out the name of the padding field - names = list(value.names) - names[-1] = '' - value.names = tuple(names) - return value + fields = value.fields + names = value.names + field_spec = dict( + names=names, + formats=[fields[name][0] for name in names], + offsets=[fields[name][1] for name in names], + itemsize=value.itemsize + ) + + field_spec['itemsize'] += padding + return dtype(field_spec) def _prod(a): p = 1 @@ -660,7 +651,7 @@ def _gcd(a, b): return a def _lcm(a, b): - return a / _gcd(a, b) * b + return a // _gcd(a, b) * b # Exception used in shares_memory() class TooHardError(RuntimeError): |