วิธีที่ง่ายที่สุดในการสลับอาเรย์ด้วยไพ ธ อนคืออะไร?
new_array = random.sample( array, len(array) )
ด้วย
วิธีที่ง่ายที่สุดในการสลับอาเรย์ด้วยไพ ธ อนคืออะไร?
new_array = random.sample( array, len(array) )
ด้วย
คำตอบ:
import random
random.shuffle(array)
import random
random.shuffle(array)
ทางเลือกอื่นในการทำสิ่งนี้โดยใช้sklearn
from sklearn.utils import shuffle
X=[1,2,3]
y = ['one', 'two', 'three']
X, y = shuffle(X, y, random_state=0)
print(X)
print(y)
เอาท์พุท:
[2, 1, 3]
['two', 'one', 'three']
ข้อได้เปรียบ: คุณสามารถสุ่มหลายอาร์เรย์พร้อมกันโดยไม่กระทบการแมป และ 'random_state' สามารถควบคุมการสับสำหรับพฤติกรรมที่ทำซ้ำได้
คำตอบอื่น ๆ นั้นง่ายที่สุด แต่ก็น่ารำคาญนิดหน่อยที่random.shuffle
วิธีนี้ไม่ได้ส่งคืนอะไรเลย - เพียงเรียงลำดับรายการที่กำหนด หากคุณต้องการเชื่อมโยงสายหรือเพียงแค่สามารถประกาศอาร์เรย์แบบสับในหนึ่งบรรทัดคุณสามารถทำได้:
import random
def my_shuffle(array):
random.shuffle(array)
return array
จากนั้นคุณสามารถทำบรรทัดเช่น:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
เมื่อจัดการกับรายการ Python ปกติงานrandom.shuffle()
จะทำตามคำตอบก่อนหน้านี้ที่แสดง
แต่เมื่อมันมาถึงndarray
( numpy.array
) ดูเหมือนว่าจะทำลายเดิมrandom.shuffle
ndarray
นี่คือตัวอย่าง:
import random
import numpy as np
import numpy.random
a = np.array([1,2,3,4,5,6])
a.shape = (3,2)
print a
random.shuffle(a) # a will definitely be destroyed
print a
เพียงใช้: np.random.shuffle(a)
ชอบrandom.shuffle
, np.random.shuffle
shuffles อาร์เรย์ในสถานที่
ในกรณีที่คุณต้องการอาร์เรย์ใหม่คุณสามารถใช้sample
:
import random
new_array = random.sample( array, len(array) )
คุณสามารถจัดเรียงอาร์เรย์ของคุณด้วยปุ่มสุ่ม
sorted(array, key = lambda x: random.random())
อ่านคีย์เพียงครั้งเดียวเพื่อเปรียบเทียบรายการระหว่างการเรียงลำดับที่มีประสิทธิภาพ
แต่ดูเหมือนว่าrandom.shuffle(array)
จะเร็วขึ้นเนื่องจากเขียนเป็นภาษาซี
array
ฉันหมายถึง Random
องค์ประกอบ: คือในอาจจะมีการสร้างใหม่เช่นชั้นในแต่ละครั้ง ฉันไม่แน่ใจว่าจริง: ในนี้จะเป็นวิธีที่ไม่ถูกต้องที่จะทำมัน: คุณควรสร้างแล้วเรียก แต่ไม่แน่ใจว่าไพ ธ อนทำงานอย่างไรlambda
random.random()
Random
java
Random rng = Random()
rng.nextGaussian()
random.random()
นอกจากคำตอบก่อนหน้านี้ฉันอยากจะแนะนำฟังก์ชั่นอื่น
numpy.random.shuffle
เช่นเดียวกับrandom.shuffle
การสับในสถานที่ อย่างไรก็ตามหากคุณต้องการส่งกลับอาเรย์แบบสับnumpy.random.permutation
เป็นฟังก์ชันที่ใช้
ฉันไม่รู้ว่าฉันใช้random.shuffle()
แต่กลับมาที่ 'ไม่มี' สำหรับฉันดังนั้นฉันจึงเขียนสิ่งนี้อาจเป็นประโยชน์กับใครบางคน
def shuffle(arr):
for n in range(len(arr) - 1):
rnd = random.randint(0, (len(arr) - 1))
val1 = arr[rnd]
val2 = arr[rnd - 1]
arr[rnd - 1] = val1
arr[rnd] = val2
return arr
# arr = numpy array to shuffle
def shuffle(arr):
a = numpy.arange(len(arr))
b = numpy.empty(1)
for i in range(len(arr)):
sel = numpy.random.random_integers(0, high=len(a)-1, size=1)
b = numpy.append(b, a[sel])
a = numpy.delete(a, sel)
b = b[1:].astype(int)
return arr[b]
ระวังว่าrandom.shuffle()
ไม่ควรใช้กับอาเรย์หลายมิติเนื่องจากเป็นสาเหตุให้เกิดซ้ำ
ลองนึกภาพคุณต้องการสับเปลี่ยนอาร์เรย์ตามมิติแรกของมันเราสามารถสร้างตัวอย่างทดสอบต่อไปนี้
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
ดังนั้นตามแกนแรกองค์ประกอบ i-th จะสอดคล้องกับเมทริกซ์ 2x3 โดยที่องค์ประกอบทั้งหมดมีค่าเท่ากับ i
หากเราใช้ฟังก์ชันสับเปลี่ยนที่ถูกต้องสำหรับอาร์เรย์หลายมิตินั่นคือnp.random.shuffle(x)
อาร์เรย์จะถูกสับตามแกนแรกตามที่ต้องการ อย่างไรก็ตามการใช้random.shuffle(x)
จะทำให้เกิดการซ้ำซ้อน คุณสามารถตรวจสอบโดยการทำงานlen(np.unique(x))
หลังจากสับที่ช่วยให้คุณ 10 (ตามคาด) มีnp.random.shuffle()
แต่เพียงประมาณ 5 random.shuffle()
เมื่อใช้