[英]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.