summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2018-10-09 19:22:01 -0500
committerGitHub <noreply@github.com>2018-10-09 19:22:01 -0500
commit072c90ea848c753b7e8b7c42d2e359f53dfd0085 (patch)
tree966494857f352d5fca6a5ee766633bf8bd652101 /numpy
parent8a560b91cf9304fded4abfd9ca0f579e72711a5c (diff)
parentec69d79693c1dbc98e35f7eafe67b8832fb969d1 (diff)
downloadnumpy-072c90ea848c753b7e8b7c42d2e359f53dfd0085.tar.gz
Merge pull request #12089 from bashtage/permutation-in-place-bug
BUG: Fix in-place permutation
Diffstat (limited to 'numpy')
-rw-r--r--numpy/random/mtrand/mtrand.pyx4
-rw-r--r--numpy/random/tests/test_regression.py22
2 files changed, 24 insertions, 2 deletions
diff --git a/numpy/random/mtrand/mtrand.pyx b/numpy/random/mtrand/mtrand.pyx
index 5097ad88f..ab5f64336 100644
--- a/numpy/random/mtrand/mtrand.pyx
+++ b/numpy/random/mtrand/mtrand.pyx
@@ -4907,8 +4907,8 @@ cdef class RandomState:
# shuffle has fast-path for 1-d
if arr.ndim == 1:
- # must return a copy
- if arr is x:
+ # Return a copy if same memory
+ if np.may_share_memory(arr, x):
arr = np.array(arr)
self.shuffle(arr)
return arr
diff --git a/numpy/random/tests/test_regression.py b/numpy/random/tests/test_regression.py
index 3b4b4ed40..ca9bbbc71 100644
--- a/numpy/random/tests/test_regression.py
+++ b/numpy/random/tests/test_regression.py
@@ -133,3 +133,25 @@ class TestRegression(object):
# Force Garbage Collection - should not segfault.
import gc
gc.collect()
+
+ def test_permutation_subclass(self):
+ class N(np.ndarray):
+ pass
+
+ np.random.seed(1)
+ orig = np.arange(3).view(N)
+ perm = np.random.permutation(orig)
+ assert_array_equal(perm, np.array([0, 2, 1]))
+ assert_array_equal(orig, np.arange(3).view(N))
+
+ class M(object):
+ a = np.arange(5)
+
+ def __array__(self):
+ return self.a
+
+ np.random.seed(1)
+ m = M()
+ perm = np.random.permutation(m)
+ assert_array_equal(perm, np.array([2, 1, 4, 0, 3]))
+ assert_array_equal(m.__array__(), np.arange(5))