Skip to content

Commit 41c06bc

Browse files
authored
ENH: Detect Fortran vs C order in array_assign_boolean_subscript (numpy#30201)
This PR fixes numpygh-30156 by detecting when to set KEEPORDER order in array_assign_boolean_subscript and adds a benchmark for it.
1 parent eba60dc commit 41c06bc

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

benchmarks/benchmarks/bench_indexing.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,22 @@ def time_assign_cast(self, ndim):
8484
arr[indx] = val
8585

8686

87+
class BooleanAssignmentOrder(Benchmark):
88+
params = ['C', 'F']
89+
param_names = ['order']
90+
91+
def setup(self, order):
92+
shape = (64, 64, 64)
93+
# emulate gh-30156: boolean assignment into a Fortran/C array
94+
self.base = np.zeros(shape, dtype=np.uint32, order=order)
95+
mask = np.random.RandomState(0).rand(*self.base.shape) > 0.5
96+
self.mask = mask.copy(order)
97+
self.value = np.uint32(7)
98+
99+
def time_boolean_assign_scalar(self, order):
100+
self.base[self.mask] = self.value
101+
102+
87103
class IndexingSeparate(Benchmark):
88104
def setup(self):
89105
self.tmp_dir = mkdtemp()

numpy/_core/src/multiarray/mapping.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,8 @@ array_assign_boolean_subscript(PyArrayObject *self,
11731173
}
11741174
else {
11751175
v_stride = 0;
1176+
/* If the same value is repeated, iteration order does not matter */
1177+
order = NPY_KEEPORDER;
11761178
}
11771179

11781180
v_data = PyArray_DATA(v);

0 commit comments

Comments
 (0)