Поменять местами определенный процент элементов в массиве - PullRequest
1 голос
/ 15 мая 2019

Я создал массив с размером 2 и формой (43, 64).Массив состоит из 2 с, 3 с, 4 с и 5 с.Теперь для каждого столбца массива я хочу поменять местами 5% всех 3 и сделать 4, и аналогично поменять местами 5% всех 5, чтобы сделать их двумя.Есть ли возможность сделать это?

Я нашел решения для замены всех 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.]]

ТеперьЯ хочу выбрать каждый столбец и обменять процент 3 с 4 и 5 с 2, но не знаю, как к этому приблизиться.

Я ожидаю, что выходной массив с тем же размером, что и раньше, просто поменял местами определенное количество значений, как показано.

1 Ответ

2 голосов
/ 15 мая 2019

Возможно, это то, что вы ищете:

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, чтобы они делали это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...