You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.7 KiB
46 lines
1.7 KiB
3 years ago
|
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;
|