簡體   English   中英

使用numpy交換數組中一定比例的元素

[英]Swap a certain percentage of elements in an array using numpy

我創建了一個尺寸為2和形狀為(43,64)的numpy數組。 該陣列由2s,3s,4s和5s組成。 對於陣列的每一列,我現在想交換所有3s的5%並使其為4,並且類似地,交換所有5s的5%使其為2。 有可能這樣做嗎?

我找到了將所有3與4交換以及將所有5與2交換的解決方案,以及交換數組的第一個和最后一個元素的解決方案。 但是,我沒有交換一定比例的元素的起點。

我用所需的尺寸初始化數組:

import numpy as np

array = np.zeros((43, 64))

然后,我創建一個循環以制作所需的數組,結果是:

[[2. 2. 2. ... 3. 5. 5.]
 [5. 5. 3. ... 2. 5. 5.]
 [4. 2. 4. ... 2. 3. 4.]
 ...
 [2. 5. 4. ... 3. 5. 5.]
 [4. 2. 3. ... 3. 5. 2.]
 [3. 3. 2. ... 3. 3. 4.]]

現在,我想選擇每列,並將3s的百分比與4s交換,並將5s與2s交換,但是不知道如何處理。

我希望輸出數組具有與以前相同的尺寸,只是交換了一定數量的值,如圖所示。

也許這就是您要尋找的:

def swap(array, n):
    indices = [i for i, x in enumerate(array) if x == n]
    for i in indices[:round(len(indices)/20)]:
        array[i] = 7-array[i]

您可以輕松地更改代碼以使其對也起作用,因此不考慮已交換的元素:

def swap(array, a, b):
    a_i = [i for i, x in enumerate(array) if x == a]
    b_i = [i for i, x in enumerate(array) if x == b]
    for i in a_i[:round(len(a_i)/20)]:
        array[i] = b
    for i in b_i[:round(len(b_i)/20)]:
        array[i] = a

本示例僅更改元素的前5%(四舍五入)。 如果您希望隨機選擇這些元素,則可以更改for循環,以便它們這樣做。

暫無
暫無

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

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