46 lines
1.7 KiB
Diff
46 lines
1.7 KiB
Diff
From d9bbd60d0f2896d1b1f865e6035dccb12db4b1a0 Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Berg <sebastian@sipsolutions.net>
|
|
Date: Sat, 23 Oct 2021 22:54:21 -0500
|
|
Subject: [PATCH] BUG: Do not use nonzero fastpath on unaligned arrays
|
|
|
|
The fast-path does not handle unalgined access, previously only
|
|
bools had a fast path (and bools are by definition always aligned
|
|
since they are stored in a single byte/char).
|
|
|
|
Closes gh-19592
|
|
---
|
|
numpy/core/src/multiarray/item_selection.c | 19 +++++++------------
|
|
1 file changed, 7 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/numpy/core/src/multiarray/item_selection.c b/numpy/core/src/multiarray/item_selection.c
|
|
index ee66378a938..33d378c2b58 100644
|
|
--- a/numpy/core/src/multiarray/item_selection.c
|
|
+++ b/numpy/core/src/multiarray/item_selection.c
|
|
@@ -2398,19 +2398,14 @@ PyArray_CountNonzero(PyArrayObject *self)
|
|
npy_intp *strideptr, *innersizeptr;
|
|
NPY_BEGIN_THREADS_DEF;
|
|
|
|
- // Special low-overhead version specific to the boolean/int types
|
|
dtype = PyArray_DESCR(self);
|
|
- switch(dtype->kind) {
|
|
- case 'u':
|
|
- case 'i':
|
|
- case 'b':
|
|
- if (dtype->elsize > 8) {
|
|
- break;
|
|
- }
|
|
- return count_nonzero_int(
|
|
- PyArray_NDIM(self), PyArray_BYTES(self), PyArray_DIMS(self),
|
|
- PyArray_STRIDES(self), dtype->elsize
|
|
- );
|
|
+ /* Special low-overhead version specific to the boolean/int types */
|
|
+ if (PyArray_ISALIGNED(self) && (
|
|
+ PyDataType_ISBOOL(dtype) || PyDataType_ISINTEGER(dtype))) {
|
|
+ return count_nonzero_int(
|
|
+ PyArray_NDIM(self), PyArray_BYTES(self), PyArray_DIMS(self),
|
|
+ PyArray_STRIDES(self), dtype->elsize
|
|
+ );
|
|
}
|
|
|
|
nonzero = PyArray_DESCR(self)->f->nonzero;
|