Как случайным образом изменить некоторые элементы 2D-матрицы на ноль в python? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть 2D-матрица из некоторых чисел, и я хочу случайным образом изменить долю ненулевых элементов (например, 0,2), чтобы она стала нулевой, а затем снова случайным образом выбрать равную этой доли (0,2) между всеми нулями и дать им случайные числа. Есть ли прямой способ сделать это? Например: исходная матрица: x = [[1,2,3], [4,0,7], [2,10,0]] После первого шага (2 случайно выбранных числа меняются на ноль): x = [[1,0,0], [4,0,7], [2,10,0]] После второго шага (2 случайно выбранных нуля меняются на случайные числа): x = [[1,0,5], [4,7,7], [2,10,0]]

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Я бы попробовал создать для этого простую функцию. Таким образом, вы можете ввести желаемое число.

import pandas as pd
import random

def random_converter(dataframe, k, isZero=True, input_data='random_value'):
  # Copy df
  dataframe_local = dataframe.copy()

  if input_data=='random_value':
    input_data = random.randint(0,10)

  ki = 0
  while ki < k:
    row_selected = dataframe_local.sample(1).T

    # VERIFY CONDITION
    if isZero:
      attributes = row_selected[row_selected.iloc[:, 0] == 0]
    else:
      attributes = row_selected[row_selected.iloc[:, 0] != 0]

    # No zero in the row
    if attributes.size == 0:
      continue

    column_index = attributes.index
    row_index = attributes.columns
    dataframe_local.iloc[row_index, column_index] = input_data    

    ki += 0
  return dataframe_local
0 голосов
/ 14 апреля 2020

Один метод:

arr = np.ones((5, 5)) # Your matrix
print("Before Replacement")
print(arr)

# Number of elements to replace
num_replaced = 3 

# Random (x, y) coordinates
indices_x = np.random.randint(0, arr.shape[0], num_replaced)
indices_y = np.random.randint(0, arr.shape[1], num_replaced)

arr[indices_x, indices_y] = 0
print("After replacement")
print(arr)

Пример вывода:

Перед заменой

[[1. 1. 1. 1. 1.]

[1. 1. 1. 1. 1.]

[1. 1. 1. 1. 1.]

[1. 1. 1. 1. 1.]

[1. 1. 1. 1. 1.]]

После замены

[[0. 1. 1. 1. 1.]

[1. 0. 1. 1. 1.]

[1. 1. 1. 1. 1.]

[1. 0. 1. 1. 1.]

[1. 1. 1. 1. 1.]]

РЕДАКТИРОВАТЬ


Вы можете использовать np.random.choice вместо np.random.randint следующим образом:

indices_x = np.random.choice(range(arr.shape[0]), num_replaced, replace=REPLACE)
indices_y = np.random.choice(range(arr.shape[1]), num_replaced, replace=REPLACE)

Здесь вы можете легко переключаться между выборками с заменой или без нее.

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