Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assorted _libs cleanups #19887

Merged
merged 10 commits into from
Feb 28, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions pandas/_libs/lib.pxd

This file was deleted.

187 changes: 13 additions & 174 deletions pandas/_libs/lib.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,9 @@ from cpython cimport (Py_INCREF, PyTuple_SET_ITEM,
PyBytes_Check,
PyUnicode_Check,
PyTuple_New,
Py_EQ,
PyObject_RichCompareBool)

cimport cpython


from cpython.datetime cimport (PyDateTime_Check, PyDate_Check,
PyTime_Check, PyDelta_Check,
PyDateTime_IMPORT)
Expand Down Expand Up @@ -105,6 +103,14 @@ def item_from_zerodim(object val):
"""
If the value is a zerodim array, return the item it contains.

Parameters
----------
val : object

Returns
-------
result : object

Examples
--------
>>> item_from_zerodim(1)
Expand All @@ -117,7 +123,9 @@ def item_from_zerodim(object val):
array([1])

"""
return util.unbox_if_zerodim(val)
if cnp.PyArray_IsZeroDim(val):
return cnp.PyArray_ToScalar(cnp.PyArray_DATA(val), val)
return val


@cython.wraparound(False)
Expand Down Expand Up @@ -405,72 +413,6 @@ def maybe_booleans_to_slice(ndarray[uint8_t] mask):
return slice(start, end)


@cython.wraparound(False)
@cython.boundscheck(False)
def scalar_compare(ndarray[object] values, object val, object op):
cdef:
Py_ssize_t i, n = len(values)
ndarray[uint8_t, cast=True] result
bint isnull_val
int flag
object x

if op is operator.lt:
flag = cpython.Py_LT
elif op is operator.le:
flag = cpython.Py_LE
elif op is operator.gt:
flag = cpython.Py_GT
elif op is operator.ge:
flag = cpython.Py_GE
elif op is operator.eq:
flag = cpython.Py_EQ
elif op is operator.ne:
flag = cpython.Py_NE
else:
raise ValueError('Unrecognized operator')

result = np.empty(n, dtype=bool).view(np.uint8)
isnull_val = checknull(val)

if flag == cpython.Py_NE:
for i in range(n):
x = values[i]
if checknull(x):
result[i] = True
elif isnull_val:
result[i] = True
else:
try:
result[i] = PyObject_RichCompareBool(x, val, flag)
except (TypeError):
result[i] = True
elif flag == cpython.Py_EQ:
for i in range(n):
x = values[i]
if checknull(x):
result[i] = False
elif isnull_val:
result[i] = False
else:
try:
result[i] = PyObject_RichCompareBool(x, val, flag)
except (TypeError):
result[i] = False

else:
for i in range(n):
x = values[i]
if checknull(x):
result[i] = False
elif isnull_val:
result[i] = False
else:
result[i] = PyObject_RichCompareBool(x, val, flag)

return result.view(bool)


@cython.wraparound(False)
@cython.boundscheck(False)
cpdef bint array_equivalent_object(object[:] left, object[:] right):
Expand All @@ -486,115 +428,12 @@ cpdef bint array_equivalent_object(object[:] left, object[:] right):

# we are either not equal or both nan
# I think None == None will be true here
if not (PyObject_RichCompareBool(x, y, cpython.Py_EQ) or
if not (PyObject_RichCompareBool(x, y, Py_EQ) or
_checknull(x) and _checknull(y)):
return False
return True


@cython.wraparound(False)
@cython.boundscheck(False)
def vec_compare(ndarray[object] left, ndarray[object] right, object op):
cdef:
Py_ssize_t i, n = len(left)
ndarray[uint8_t, cast=True] result
int flag

if n != len(right):
raise ValueError('Arrays were different lengths: %d vs %d'
% (n, len(right)))

if op is operator.lt:
flag = cpython.Py_LT
elif op is operator.le:
flag = cpython.Py_LE
elif op is operator.gt:
flag = cpython.Py_GT
elif op is operator.ge:
flag = cpython.Py_GE
elif op is operator.eq:
flag = cpython.Py_EQ
elif op is operator.ne:
flag = cpython.Py_NE
else:
raise ValueError('Unrecognized operator')

result = np.empty(n, dtype=bool).view(np.uint8)

if flag == cpython.Py_NE:
for i in range(n):
x = left[i]
y = right[i]

if checknull(x) or checknull(y):
result[i] = True
else:
result[i] = PyObject_RichCompareBool(x, y, flag)
else:
for i in range(n):
x = left[i]
y = right[i]

if checknull(x) or checknull(y):
result[i] = False
else:
result[i] = PyObject_RichCompareBool(x, y, flag)

return result.view(bool)


@cython.wraparound(False)
@cython.boundscheck(False)
def scalar_binop(ndarray[object] values, object val, object op):
cdef:
Py_ssize_t i, n = len(values)
ndarray[object] result
object x

result = np.empty(n, dtype=object)
if _checknull(val):
result.fill(val)
return result

for i in range(n):
x = values[i]
if _checknull(x):
result[i] = x
else:
result[i] = op(x, val)

return maybe_convert_bool(result)


@cython.wraparound(False)
@cython.boundscheck(False)
def vec_binop(ndarray[object] left, ndarray[object] right, object op):
cdef:
Py_ssize_t i, n = len(left)
ndarray[object] result

if n != len(right):
raise ValueError('Arrays were different lengths: %d vs %d'
% (n, len(right)))

result = np.empty(n, dtype=object)

for i in range(n):
x = left[i]
y = right[i]
try:
result[i] = op(x, y)
except TypeError:
if _checknull(x):
result[i] = x
elif _checknull(y):
result[i] = y
else:
raise

return maybe_convert_bool(result)


def astype_intsafe(ndarray[object] arr, new_dtype):
cdef:
Py_ssize_t i, n = len(arr)
Expand Down
Loading