Author: Brian Kearns <[email protected]>
Branch:
Changeset: r69350:eea11bc790e6
Date: 2014-02-24 04:49 -0500
http://bitbucket.org/pypy/pypy/changeset/eea11bc790e6/
Log: fix some numpy string type handling
diff --git a/pypy/module/micronumpy/interp_numarray.py
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -1447,7 +1447,7 @@
# scalars and strings w/o __array__ method
isstr = space.isinstance_w(w_object, space.w_str)
if not issequence_w(space, w_object) or isstr:
- if dtype is None or dtype.is_str_or_unicode():
+ if dtype is None or (dtype.is_str_or_unicode() and dtype.get_size() <
1):
dtype = interp_ufuncs.find_dtype_for_scalar(space, w_object)
return W_NDimArray.new_scalar(space, dtype, w_object)
@@ -1500,6 +1500,8 @@
def zeros(space, w_shape, w_dtype=None, w_order=None):
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype))
+ if dtype.is_str_or_unicode() and dtype.get_size() < 1:
+ dtype = interp_dtype.variable_dtype(space, dtype.char + '1')
shape = _find_shape(space, w_shape, dtype)
return W_NDimArray.from_shape(space, shape, dtype=dtype)
@@ -1511,6 +1513,8 @@
else:
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype),
w_dtype))
+ if dtype.is_str_or_unicode() and dtype.get_size() < 1:
+ dtype = interp_dtype.variable_dtype(space, dtype.char + '1')
return W_NDimArray.from_shape(space, w_a.get_shape(), dtype=dtype,
w_instance=w_a if subok else None)
diff --git a/pypy/module/micronumpy/test/test_numarray.py
b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -387,12 +387,15 @@
assert zeros(()).shape == ()
assert zeros((), dtype='S') == ''
assert zeros((), dtype='S').shape == ()
+ assert zeros((), dtype='S').dtype == '|S1'
def test_empty_like(self):
import numpy as np
a = np.empty_like(np.zeros(()))
assert a.shape == ()
assert a.dtype == np.float_
+ a = np.empty_like(a, dtype='S')
+ assert a.dtype == '|S1'
a = np.zeros((2, 3))
assert a.shape == (2, 3)
a[0,0] = 1
@@ -1677,11 +1680,12 @@
assert exc.value[0] == "data-type must not be 0-sized"
assert a.view('S4') == '\x03'
a = array('abc1', dtype='c')
- assert a.view('S4') == 'abc1'
import sys
if '__pypy__' in sys.builtin_module_names:
- raises(NotImplementedError, a.view, [('a', 'i2'), ('b', 'i2')])
+ raises(ValueError, a.view, 'S4')
+ raises(ValueError, a.view, [('a', 'i2'), ('b', 'i2')])
else:
+ assert a.view('S4') == 'abc1'
b = a.view([('a', 'i2'), ('b', 'i2')])
assert b.shape == (1,)
assert b[0][0] == 25185
@@ -3397,6 +3401,12 @@
a = array('x', dtype='c')
assert str(a.dtype) == '|S1'
assert a == 'x'
+ a = array('abc', 'S2')
+ assert a.dtype.str == '|S2'
+ assert a == 'ab'
+ a = array('abc', 'S5')
+ assert a.dtype.str == '|S5'
+ assert a == 'abc'
def test_newbyteorder(self):
import numpy as np
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -1661,15 +1661,17 @@
@jit.unroll_safe
def coerce(self, space, dtype, w_item):
- from pypy.module.micronumpy.interp_dtype import new_string_dtype
if isinstance(w_item, interp_boxes.W_StringBox):
return w_item
if w_item is None:
w_item = space.wrap('')
arg = space.str_w(space.str(w_item))
- arr = VoidBoxStorage(len(arg), new_string_dtype(space, len(arg)))
- for i in range(len(arg)):
+ arr = VoidBoxStorage(dtype.size, dtype)
+ j = min(len(arg), dtype.size)
+ for i in range(j):
arr.storage[i] = arg[i]
+ for j in range(j, dtype.size):
+ arr.storage[j] = '\x00'
return interp_boxes.W_StringBox(arr, 0, arr.dtype)
def store(self, arr, i, offset, box):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit