summaryrefslogtreecommitdiff
path: root/numpy/core/_internal.py
diff options
context:
space:
mode:
authorEric Wieser <wieser.eric@gmail.com>2017-05-05 11:40:23 +0100
committerEric Wieser <wieser.eric@gmail.com>2017-05-05 12:00:30 +0100
commitfed2e1a4304123f8a0cc4313cae9ffe3d6614b78 (patch)
treed8174793617ecd573573f7f26e3796f0d21551c7 /numpy/core/_internal.py
parent7f6c95fe1d3873fae6b83530e9ee7a3f5f357504 (diff)
downloadnumpy-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.py45
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):