簡體   English   中英

如何有效地改變數組中一定數量的值?

[英]How to efficiently mutate certain num of values in an array?

給定初始二維數組:

initial = [
 [0.6711999773979187, 0.1949000060558319],
 [-0.09300000220537186, 0.310699999332428],
 [-0.03889999911189079, 0.2736999988555908],
 [-0.6984000205993652, 0.6407999992370605],
 [-0.43619999289512634, 0.5810999870300293],
 [0.2825999855995178, 0.21310000121593475],
 [0.5551999807357788, -0.18289999663829803],
 [0.3447999954223633, 0.2071000039577484],
 [-0.1995999962091446, -0.5139999985694885],
 [-0.24400000274181366, 0.3154999911785126]]

目標是將數組內的一些隨機值乘以隨機百分比。 假設只有3個隨機數被隨機乘數代替,我們應該得到如下內容:

output = [
 [0.6711999773979187, 0.52],
 [-0.09300000220537186, 0.310699999332428],
 [-0.03889999911189079, 0.2736999988555908],
 [-0.6984000205993652, 0.6407999992370605],
 [-0.43619999289512634, 0.5810999870300293],
 [0.84, 0.21310000121593475],
 [0.5551999807357788, -0.18289999663829803],
 [0.3447999954223633, 0.2071000039577484],
 [-0.1995999962091446, 0.21],
 [-0.24400000274181366, 0.3154999911785126]]

我嘗試這樣做:

def mutate(array2d, num_changes):
    for _ in range(num_changes):
        row, col = initial.shape
        rand_row = np.random.randint(row)
        rand_col = np.random.randint(col)
        cell_value = array2d[rand_row][rand_col] 
        array2d[rand_row][rand_col] =  random.uniform(0, 1) * cell_value
    return array2d

這適用於2D數組,但相同的值可能會多次被突變==

而且我不認為這是有效的,它僅適用於2D陣列。

有沒有一種方法可以更有效地對任何形狀的數組進行這種“變異”?

對於“變異”可以選擇哪個值沒有任何限制,但是“變異”的數量應嚴格限制在用戶指定的數量之內。

一種相當簡單的方法是使用數組的斜視圖。 您可以通過這種方式一次生成所有數字,並可以更輕松地保證一次調用不會處理相同的索引兩次:

def mutate(array_anyd, num_changes):
    raveled = array_anyd.reshape(-1)
    indices = np.random.choice(raveled.size, size=num_changes, replace=False)
    values = np.random.uniform(0, 1, size=num_changes)
    raveled[indices] *= values

我使用array_anyd.reshape(-1)來支持array_anyd.ravel()因為根據docs ,前者不太可能無意間復制。

當然仍然是這樣的可能性。 您可以根據需要添加額外的支票以寫回。 一種更有效的方法是使用np.unravel_index避免創建以以下內容開頭的視圖:

def mutate(array_anyd, num_changes):
    indices = np.random.choice(array_anyd.size, size=num_changes, replace=False)
    indices = np.unravel_indices(indices, array_anyd.shape)
    values = np.random.uniform(0, 1, size=num_changes)
    raveled[indices] *= values

由於修改是就地完成的,因此無需返回任何內容。 按照慣例,此類函數不返回任何內容。 參見例如list.sortsorted

使用shuffle代替random_choice ,這將是另一種解決方案。 它可以處理任何形狀的數組。

def mutate(arrayIn, num_changes):
    mult = np.zeros(arrayIn.ravel().shape[0])
    mult[:num_changes] = np.random.uniform(0,1,num_changes)
    np.random.shuffle(mult)
    mult = mult.reshape(arrayIn.shape)
    arrayIn = arrayIn + mult*arrayIn
    return arrayIn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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