[英]Shuffle part of array in numpy
我有一個numpy數組,我想改組它的一部分。 例如,使用以下數組:
import numpy as np
import random
a = np.arange(15)
# => array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
我想要做:
shuffle_parts(a, [(0, 3), (10, 13)])
# => array([ 2, 0, 1, 3, 4, 5, 6, 7, 8, 9, 12, 11, 10, 13, 14])
# ^^^^^^^^^ ^^^^^^^^^^
# Shuffle those 3 values and those 3 values
以下內容將重新整理所有數組:(不是我想要的)
random.shuffle(a)
# => array([10, 11, 8, 1, 13, 5, 9, 14, 4, 7, 2, 12, 3, 0, 6])
一種方法是像這樣使用split / concatenate:
splits = np.split(a, 5)
random.shuffle(splits[0])
random.shuffle(splits[3])
np.concatenate(splits)
# => array([ 2, 0, 1, 3, 4, 5, 6, 7, 8, 11, 10, 9, 12, 13, 14])
# ^^^^^^^^^ ^^^^^^^^^^
# Correctly shuffled Shuffled but off by 1 index
這幾乎是我想要的。 我的問題:
shuffle_parts
嗎(具有任意索引的部分,不限於模數,以及具有可變長度的部分) 可以直接完成:
>>> import numpy as np
>>> import random
>>> a = np.arange(15)
>>> s=3
>>> f=7
>>> random.shuffle(a[s:f])
>>> a
array([ 0, 1, 2, 5, 4, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14])
索引直接引用數據,使之成為可能。
numpy slice是以下數據的視圖 ; 因此,您可以直接將切片隨機播放:
import numpy as np
import random
a = np.arange(15)
random.shuffle(a[0:3])
random.shuffle(a[10:13])
print(a)
# [ 2 0 1 3 4 5 6 7 8 9 12 10 11 13 14]
您可以通過以下方式使用slice
實現shuffle_parts
函數:
def shuffle_parts(array, slices):
for s in slices:
random.shuffle(a[slice(*s)])
shuffle_parts(array=a, slices=((0, 3), (10, 13)))
或(取決於您想如何將切片傳遞給函數):
def shuffle_parts(array, slices):
for s in slices:
random.shuffle(a[s])
shuffle_parts(array=a, slices=(slice(0, 3), slice(10, 13)))
我個人更喜歡第二個版本(這樣,您也可以例如改組偶數索引: shuffle_parts(array=a, slices=(slice(None, None, 2), ))
)...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.