Skip to content

Commit 96375da

Browse files
committed
BUG: return NumPy scalars from Series, same speed as before, GH #510
1 parent 9e6d49a commit 96375da

File tree

3 files changed

+14
-4
lines changed

3 files changed

+14
-4
lines changed

pandas/src/numpy_helper.h

+6
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,9 @@ assign_value_1d(PyArrayObject* ap, Py_ssize_t _i, PyObject* v) {
3939
char *item = (char *) PyArray_DATA(ap) + i * PyArray_STRIDE(ap, 0);
4040
return PyArray_DESCR(ap)->f->setitem(v, item, ap);
4141
}
42+
43+
PANDAS_INLINE PyObject*
44+
get_value_1d(PyArrayObject* ap, Py_ssize_t i) {
45+
char *item = (char *) PyArray_DATA(ap) + i * PyArray_STRIDE(ap, 0);
46+
return PyArray_Scalar(item, PyArray_DESCR(ap), (PyObject*) ap);
47+
}

pandas/src/util.pxd

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ cdef extern from "numpy_helper.h":
66
inline int is_float_object(object)
77
inline int is_bool_object(object)
88
inline int is_string_object(object)
9-
inline int assign_value_1d (ndarray, Py_ssize_t, object) except -1
10-
9+
inline int assign_value_1d(ndarray, Py_ssize_t, object) except -1
10+
inline object get_value_1d(ndarray, Py_ssize_t)
1111

1212
cdef inline object get_value_at(ndarray arr, object loc):
1313
cdef:
@@ -24,8 +24,8 @@ cdef inline object get_value_at(ndarray arr, object loc):
2424
i += sz
2525
elif i >= sz:
2626
raise IndexError('index out of bounds')
27-
data_ptr = cnp.PyArray_GETPTR1(arr, i)
28-
return cnp.PyArray_GETITEM(arr, data_ptr)
27+
28+
return get_value_1d(arr, i)
2929

3030
cdef inline set_value_at(ndarray arr, object loc, object value):
3131
cdef:

pandas/tests/test_series.py

+4
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ def test_getitem_out_of_bounds(self):
359359
# don't segfault, GH #495
360360
self.assertRaises(IndexError, self.ts.__getitem__, len(self.ts))
361361

362+
def test_getitem_box_float64(self):
363+
value = self.ts[5]
364+
self.assert_(isinstance(value, np.float64))
365+
362366
def test_slice(self):
363367
numSlice = self.series[10:20]
364368
numSliceEnd = self.series[-10:]

0 commit comments

Comments
 (0)