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.
gentoo-overlay/dev-python/numpy/files/numpy-1.21.3-unaligned-arra...

46 lines
1.7 KiB

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;