2017-07-05 51 views
5

Używam random.shuffle do przetasowania tablicy 2D numpy. Spotkałem się z następującym problemem:python: dlaczego random.shuffle zmienia tablicę

import numpy as np 
from random import shuffle as sf 

b = np.array([1,2,3,4,5]) 
print b 
# [1 2 3 4 5] 
sf(b) 
print b 
# [1 4 5 3 2] 

a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
print a 
# [[1 2 3] 
# [4 5 6] 
# [7 8 9]] 
sf(a) 
print a 
# [[1 2 3] 
# [4 5 6] 
# [1 2 3]] 

Wynik pokazuje, że podczas tasowania tablicy 1D wszystko jest poprawne. Ale podczas tasowania tablicy 2D wynik staje się dziwny.

Dlaczego trzeci wiersz oryginalnej tablicy jest odrzucany, a pierwszy wiersz jest podwójnie duplikowany?

Wiem, że mogą istnieć rozwiązania, które pozwolą rozwiązać ten problem, na przykład najpierw przetasować tablicę 1D, wskazującą identyfikatory rzędów, a następnie wyodrębnić tablicę 2D w kolejności identyfikatorów przetasowanych. Ale chcę wyjaśnić, co dzieje się z implementacją random.shuffle lub co jest nie tak z moim kodem.

+0

To zmarnowało dużo mojego czasu i zajęło mi 1 tydzień, aby dowiedzieć się, że random.shuffle nie działa w takich przypadkach. – Blackberry

Odpowiedz

8

Opcja losowania z modułu random nie jest przeznaczona do obsługi tablic numpy, ponieważ nie jest dokładnie taka sama jak lista zagnieżdżonych pytonów. Zamiast tego należy użyć modułu numpy.random modułu numpy.random.

import numpy as np 
from numpy.random import shuffle 

arr = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
shuffle(arr) 
print(arr) 
# output: 
# [[4 5 6] 
# [1 2 3] 
# [7 8 9]] 
+3

Powiązane: https://github.com/numpy/numpy/issues/1655 –