簡體   English   中英

在numpy中隨機播放數組的一部分

[英]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嗎(具有任意索引的部分,不限於模數,以及具有可變長度的部分)
  • 我錯過了numpy中的方法,這可以幫助我做到這一點嗎?

可以直接完成:

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM