[Numpy-svn] r8221 - in trunk/numpy/core: . src/multiarray tests
numpy-svn at scipy.org
numpy-svn at scipy.org
Sat Feb 20 21:52:39 EST 2010
Author: ptvirtan
Date: 2010-02-20 20:52:39 -0600 (Sat, 20 Feb 2010)
New Revision: 8221
Modified:
trunk/numpy/core/_internal.py
trunk/numpy/core/src/multiarray/buffer.c
trunk/numpy/core/tests/test_multiarray.py
Log:
3K: ENH: core: support BOOL and VOID better in PEP 3118 buffers
Modified: trunk/numpy/core/_internal.py
===================================================================
--- trunk/numpy/core/_internal.py 2010-02-21 02:52:20 UTC (rev 8220)
+++ trunk/numpy/core/_internal.py 2010-02-21 02:52:39 UTC (rev 8221)
@@ -351,6 +351,7 @@
# construct a Numpy dtype
_pep3118_map = {
+ '?': '?',
'b': 'b',
'B': 'B',
'h': 'h',
@@ -373,6 +374,7 @@
'O': 'O',
'x': 'V', # padding
}
+_pep3118_typechars = ''.join(_pep3118_map.keys())
def _dtype_from_pep3118(spec, byteorder='=', is_subdtype=False):
from numpy.core.multiarray import dtype
@@ -421,10 +423,10 @@
if itemsize != 1:
# Not supported
raise ValueError("Non item-size 1 structures not supported")
- elif spec[0].isalpha():
+ elif spec[0] in _pep3118_typechars:
j = 1
for j in xrange(1, len(spec)):
- if not spec[j].isalpha():
+ if spec[j] not in _pep3118_typechars:
break
typechar = spec[:j]
spec = spec[j:]
@@ -446,16 +448,18 @@
value = dtype((value, shape))
# Field name
+ this_explicit_name = False
if spec and spec.startswith(':'):
i = spec[1:].index(':') + 1
name = spec[1:i]
spec = spec[i+1:]
explicit_name = True
+ this_explicit_name = True
else:
name = 'f%d' % findex
findex += 1
- if not is_padding:
+ if not is_padding or this_explicit_name:
fields[name] = (value, offset)
offset += value.itemsize
Modified: trunk/numpy/core/src/multiarray/buffer.c
===================================================================
--- trunk/numpy/core/src/multiarray/buffer.c 2010-02-21 02:52:20 UTC (rev 8220)
+++ trunk/numpy/core/src/multiarray/buffer.c 2010-02-21 02:52:39 UTC (rev 8221)
@@ -238,6 +238,7 @@
}
switch (descr->type_num) {
+ case NPY_BOOL: if (_append_char(str, '?')) return -1; break;
case NPY_BYTE: if (_append_char(str, 'b')) return -1; break;
case NPY_UBYTE: if (_append_char(str, 'B')) return -1; break;
case NPY_SHORT: if (_append_char(str, 'h')) return -1; break;
@@ -254,6 +255,9 @@
case NPY_CFLOAT: if (_append_str(str, "Zf")) return -1; break;
case NPY_CDOUBLE: if (_append_str(str, "Zd")) return -1; break;
case NPY_CLONGDOUBLE: if (_append_str(str, "Zg")) return -1; break;
+ /* XXX: datetime */
+ /* XXX: timedelta */
+ case NPY_OBJECT: if (_append_char(str, 'O')) return -1; break;
case NPY_STRING: {
char buf[128];
PyOS_snprintf(buf, sizeof(buf), "%ds", descr->elsize);
@@ -268,9 +272,15 @@
if (_append_str(str, buf)) return -1;
break;
}
- case NPY_OBJECT: if (_append_char(str, 'O')) return -1; break;
+ case NPY_VOID: {
+ /* Insert padding bytes */
+ char buf[128];
+ PyOS_snprintf(buf, sizeof(buf), "%dx", descr->elsize);
+ if (_append_str(str, buf)) return -1;
+ break;
+ }
default:
- PyErr_Format(PyExc_ValueError, "unknown dtype code %d",
+ PyErr_Format(PyExc_ValueError, "cannot convert dtype %d to buffer",
descr->type_num);
return -1;
}
Modified: trunk/numpy/core/tests/test_multiarray.py
===================================================================
--- trunk/numpy/core/tests/test_multiarray.py 2010-02-21 02:52:20 UTC (rev 8220)
+++ trunk/numpy/core/tests/test_multiarray.py 2010-02-21 02:52:39 UTC (rev 8221)
@@ -1491,9 +1491,11 @@
('j', np.double),
('k', np.longdouble),
('l', 'S4'),
- ('m', 'U4')]
+ ('m', 'U4'),
+ ('n', 'V3'),
+ ('o', '?')]
x = np.array([(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- asbytes('aaaa'), 'bbbb')],
+ asbytes('aaaa'), 'bbbb', asbytes('xxx'), True)],
dtype=dt)
self._check_roundtrip(x)
@@ -1549,17 +1551,19 @@
('j', np.double),
('k', np.longdouble),
('l', 'S4'),
- ('m', 'U4')]
+ ('m', 'U4'),
+ ('n', 'V3'),
+ ('o', '?')]
x = np.array([(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- asbytes('aaaa'), 'bbbb')],
+ asbytes('aaaa'), 'bbbb', asbytes(' '), True)],
dtype=dt)
y = memoryview(x)
- assert y.format == 'T{b:a:=h:b:=l:c:=q:d:B:e:=H:f:=L:g:=Q:h:=d:i:=d:j:=g:k:4s:l:=4w:m:}'
+ assert y.format == 'T{b:a:=h:b:=l:c:=q:d:B:e:=H:f:=L:g:=Q:h:=d:i:=d:j:=g:k:4s:l:=4w:m:3x:n:?:o:}'
assert y.shape == (1,)
assert y.ndim == 1
- assert y.strides == (78,)
+ assert y.strides == (82,)
assert y.suboffsets is None
- assert y.itemsize == 78
+ assert y.itemsize == 82
def test_export_subarray(self):
x = np.array(([[1,2],[3,4]],), dtype=[('a', (int, (2,2)))])
More information about the Numpy-svn
mailing list