Сгенерированный вектором numpy столбец со значениями при условии - PullRequest
1 голос
/ 27 января 2020

Предположим, у меня есть массив numpy, сгенерированный следующим образом:

np.random.seed(1)
arr = np.random.randint(10,size=(5,2))

, который производит следующее:

array([[5, 8],
       [9, 5],
       [0, 0],
       [1, 7],
       [6, 9]])

Как мне:

  • случайно добавить новый столбец с его собственным диапазоном , убедившись, что его значения НЕ соответствуют никаким значениям в других столбцах? Например, простое добавление другого массива не будет работать, потому что это не будет гарантировать, что не будет иметь дублирующиеся значения.

Следующее будет недопустимым, поскольку, как мы видим в первой строке, третий столбец это 8, где второй столбец также 8:

np.append(arr, np.random.randint(10,size=(5,1)), axis=1)

array([[5, 8, 8],
   [9, 5, 8],
   [0, 0, 6],
   [1, 7, 2],
   [6, 9, 8]])

Подвопрос:

  • как создать другой столбец со значениями, отличными от выбранных столбцов, например все в порядке, чтобы значение было равно второму столбцу, но запрещается совпадать с первым столбцом.

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

1 Ответ

2 голосов
/ 27 января 2020

Вот один из способов сделать это:

import random

def my_randint(a, select_columns, n):
    integers = list(set(range(n)).difference(a[select_columns]))
    return random.choice(integers)

new_col = np.apply_along_axis(my_randint, axis=1, arr=arr, select_columns=[0, 1], n=10) 
new_arr = np.hstack([arr, new_col[:,None]])

Обратите внимание, что я использую random.choice вместо np.random.choice, потому что он быстрее.

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