#python #arrays #numpy
#python #массивы #numpy
Вопрос:
То, что я пытаюсь сделать, это получить два разных массива, где первый массив просто заполнен нулями, а второй массив будет заполнен случайными числами. Я хотел бы выполнить операцию, при которой в массив, заполненный нулями, добавляются только определенные элементы из последнего массива, а остальные элементы в первом массиве остаются равными нулю. Я также пытаюсь выполнить добавление случайным образом. Я просто добавил приведенный ниже код в качестве примера. Я, честно говоря, не знаю, как выполнить что-то подобное, и я был бы очень благодарен за любую помощь или предложения! Спасибо!
shape = (6, 3)
empty_array = np.zeros(shape)
random_array = 0.1 * np.random.randn(*empty_array)
sum = np.add(empty_array, random_array)
Комментарии:
1. Вы могли бы изучить индексацию с помощью логического массива. Тогда, например, вы могли бы выполнить sum[values_to_change] = np.add(empty_array[values_to_change], random_array[values_to_change]). В этом случае values_to_change будет представлять собой массив размером 6×3, содержащий значение True или False
2. просто для пояснения, сначала вы генерируете матрицу размера shape, заполненную нулями. второй (случайный) массив будет иметь ту же форму, что и эта матрица? и если это так, то он случайным образом добавит элементы одного и того же индекса? или он выбирает случайное добавление чисел из одномерного списка?
3. Я рассмотрю это. Однако будут ли T или F в массиве values_to_change меняться также для каждой итерации или это будет что-то согласованное? Я спрашиваю, потому что добавление между пустым и случайным массивами, вероятно, будет выполнено более 100 раз. Спасибо!
4. @RashanArshad, по сути, только 20% значений, которые создаются в случайном массиве, будут добавлены к массиву, заполненному нулями. Единственным контролируемым параметром будет процент значений, которые добавляются в пустой массив.
5. Вам нужно уточнить свой код (возможно, с примером ввода / желаемого вывода). Кроме того, не используйте
sum
в качестве имени переменной, это ключевое слово в python.
Ответ №1:
Вы можете использовать двоичную маску с плотностью P
:
P = 0.5
# Repeat the next two lines as needed
mask = np.random.binomial(1, P, size = empty_array.size)
.reshape(shape).astype(bool)
empty_array[mask] = random_array[mask]
Если вы планируете добавить больше случайных элементов, вы можете повторно генерировать маску на каждой последующей итерации.
Ответ №2:
Если я правильно понял вас из ваших комментариев, вы хотите создавать случайные числа по случайным индексам на основе порога в несколько процентов от всего массива (вам не нужно создавать весь случайный массив и использовать только процент от него, такая генерация случайных чисел обычно обходится дорого в больших масштабах):
sz = shape[0]*shape[1]
#this is your for example 20% threshold
threshold = 0.2
#create random numbers and random indices
random_array = np.random.rand(int(threshold*sz))
random_idx = np.random.randint(0,sz,int(threshold*sz))
#now you can add this random_array to random indices of your desired array
empty_array.reshape(-1)[random_idx] = random_array
или другое решение:
sz = shape[0]*shape[1]
#this is your for example 20% threshold
threshold = 0.2
random_array = np.random.rand(int(threshold*sz))
#pad with enough zeros and randomly shuffle and finally reshape it
random_array.resize(sz)
np.random.shuffle(random_array)
#now you can add this random_array to any array of your choice
empty_array = random_array.reshape(shape)
пример вывода:
[[0. 0. 0. ]
[0. 0. 0. ]
[0. 0. 0.7397274 ]
[0. 0. 0. ]
[0. 0. 0.79541551]
[0.75684113 0. 0. ]]
Комментарии:
1. Предоставленный вами образец вывода — это именно то, что я ищу. Однако, когда я пытаюсь запустить ваш код, я продолжаю сталкиваться со следующей ошибкой: «Ошибка значения: не удалось передать операнды вместе с формами (6,3) (18,) (6,3)»
2. @AP_98 Спасибо, что уловили это. Изменение формы было в неправильной строке. Исправлено. Теперь должно сработать.
3. @AP_98 Добро пожаловать. Я только что обновил сообщение еще более быстрым и коротким решением, если для вас важна производительность.