[NumPy-Tickets] [NumPy] #1751: recfunctions.append_fields fails on arrays containing objects
NumPy Trac
numpy-tickets@scipy....
Mon Feb 28 08:53:40 CST 2011
#1751: recfunctions.append_fields fails on arrays containing objects
---------------------+------------------------------------------------------
Reporter: aickley | Owner: somebody
Type: defect | Status: new
Priority: normal | Milestone: 2.0.0
Component: Other | Version: 1.5.1
Keywords: |
---------------------+------------------------------------------------------
The problem is that append_fields calls array.view() which does not accept
arrays containing objects (See
[http://projects.scipy.org/numpy/ticket/674])
Test case (to include in numpy/lib/tests/recfunctions.py):
{{{
class TestAppendFieldsObj(TestCase):
"""
Test append_fields with arrays containing objects
"""
def setUp(self):
from datetime import date
self.data = dict(obj=date(2000, 1, 1))
def test_append_to_objects(self):
"Test append_fields when the base array contains objects"
obj = self.data['obj']
x = np.array([(obj, 1.), (obj, 2.)], dtype=[('A', object), ('B',
float)])
y = np.array([10, 20], dtype=int)
test = append_fields(x, 'C', data=y, usemask=False)
control = np.array([(obj, 1.0, 10), (obj, 2.0, 20)],
dtype=[('A', object), ('B', float), ('C',
int)])
assert_equal(test, control)
#
def test_append_with_objects(self):
"Test append_fields when the appended data contains objects"
obj = self.data['obj']
x = np.array([(10, 1.), (20, 2.)], dtype=[('A', int), ('B',
float)])
y = np.array([obj, obj], dtype=object)
test = append_fields(y, 'C', data=y, dtypes=object, usemask=False)
control = np.array([(10, 1.0, obj), (20, 2.0, obj)],
dtype=[('A', int), ('B', float), ('C',
object)])
assert_equal(test, control)
}}}
{{{
======================================================================
ERROR: Test append_fields when the base array contains objects
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/kolpakov/lib/python2.6/site-
packages/numpy/lib/tests/test_recfunctions.py", line 406, in
test_append_to_objects
test = append_fields(x, 'C', data=y, usemask=False)
File "/home/kolpakov/lib/python2.6/site-
packages/numpy/lib/recfunctions.py", line 629, in append_fields
base = merge_arrays(base, usemask=usemask, fill_value=fill_value)
File "/home/kolpakov/lib/python2.6/site-
packages/numpy/lib/recfunctions.py", line 399, in merge_arrays
return seqarrays.view(dtype=seqdtype, type=seqtype)
TypeError: Cannot change data-type for object array.
======================================================================
ERROR: Test append_fields when the appended data contains objects
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/kolpakov/lib/python2.6/site-
packages/numpy/lib/tests/test_recfunctions.py", line 416, in
test_append_with_objects
test = append_fields(y, 'C', data=y, dtypes=object, usemask=False)
File "/home/kolpakov/lib/python2.6/site-
packages/numpy/lib/recfunctions.py", line 627, in append_fields
for (a, n, d) in zip(data, names, dtypes)]
TypeError: Cannot change data-type for object array.
----------------------------------------------------------------------
Ran 33 tests in 0.062s
}}}
Regarding the first failure, append_fields calls merge_arrays on the base
array:
{{{
base = merge_arrays(base, usemask=usemask, fill_value=fill_value)
}}}.
Actually this line can be completely removed without breaking existing
unit tests. I don't like this call because if we are calling merge_array
on a single array we are are not actually _merging_ anything, but rather
making sure that the array conforms to certain criteria. Maybe this code
should be refactored out from merge_arrays...
--
Ticket URL: <http://projects.scipy.org/numpy/ticket/1751>
NumPy <http://projects.scipy.org/numpy>
My example project
More information about the NumPy-Tickets
mailing list