亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Numpy 將數組分成 N 個不同大小的隨機塊

使用 Numpy 將數組分成 N 個不同大小的隨機塊

滄海一幻覺 2023-06-20 17:30:06
使用numpy.array_splits,您可以將數組拆分為大小相等的塊。有沒有辦法根據列表將它分成塊?我如何將這個數組分成 4 個塊,每個塊由中給定的塊的大小決定chunk_size,并由數組中的隨機值組成?import numpy as npnp.random.seed(13)a = np.arange(20)chunk_size = [10, 5, 3, 2]dist = [np.random.choice(a, c) for c in chunk_size]print(dist)但正如預期的那樣,我得到了多次重復:[array([18, 16, 10, 16,  6,  2, 12,  3,  2, 14]), array([ 5, 13, 10,  9, 11]), array([ 2,  0, 19]), array([19, 11])]例如,16 在第一個塊中包含兩次10 包含在第一個和第二個塊中使用np.split,這是我得到的答案:>>> for s in np.split(a, chunk_size):...     print(s.shape)...(10,)(0,)(0,)(0,)(18,)使用np.random.choiceand replace=False,仍然給出重復的元素:import numpy as npnp.random.seed(13)a = np.arange(20)chunk_size = [10, 5, 3, 2]dist = [np.random.choice(a, c, replace=False) for c in chunk_size]print(dist)雖然每個塊現在不包含重復項,但它不會阻止,例如,第一個和第二個塊中都包含 7:[array([11, 12,  0,  1,  8,  5,  7, 15, 14, 13]), array([16,  7, 13,  9, 19]), array([1, 4, 2]), array([15, 12])]
查看完整描述

2 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

確保 的每個元素a恰好包含在一個塊中的一種方法是a首先創建一個隨機排列,然后將其拆分為np.split。


為了np.split從中獲取一組拆分索引chunk_size,您可以使用np.cumsum.


例子

>>> import numpy as np

>>> np.random.seed(13)

>>> a = np.arange(20)

>>> b = np.random.permutation(a)

>>> b

array([11, 12,  0,  1,  8,  5,  7, 15, 14, 13,

        3, 17,  9,  4,  2,  6, 19, 10, 16, 18])


>>> chunk_size = [10, 5, 3, 2]

>>> np.cumsum(chunk_size)

array([10, 15, 18, 20])


>>> np.split(b, np.cumsum(chunk_size))

[array([11, 12,  0,  1,  8,  5,  7, 15, 14, 13]),

 array([ 3, 17,  9,  4,  2]), array([ 6, 19, 10]), array([16, 18]),

 array([], dtype=int64)]

您可以通過省略 中的最后一個值來避免尾隨空數組chunk_size,因為它由 的大小a和先前值的總和暗示:


>>> np.split(b, np.cumsum(chunk_size[:-1]))  # [10, 5, 3] -- 2 is implied

[array([11, 12,  0,  1,  8,  5,  7, 15, 14, 13]),

 array([ 3, 17,  9,  4,  2]), array([ 6, 19, 10]), array([16, 18])]


查看完整回答
反對 回復 2023-06-20
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

import numpy as np

np.random.seed(13)

dist = np.arange(0, 3286, 1)

chunk_size = [975, 708, 515, 343, 269, 228, 77, 57, 42, 33, 11, 9, 7, 4, 3, 1, 1, 1, 1, 1]

dist = [np.random.choice(dist,_, replace=False) for _ in chunk_size]


查看完整回答
反對 回復 2023-06-20
  • 2 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號