Python - 如何在现有矩阵中随机添加n个零?

3

我有一个使用default_rng函数生成的数组:

import numpy as np
from numpy.random import default_rng
rng = default_rng(seed=10)
rng = rng.integers(1,20,(5,10))
rng

>>>array([[15, 19,  6,  4, 16, 16, 10,  3, 16, 10],
          [ 3,  3,  8, 14,  8, 16,  1,  9, 10, 19],
          [ 5, 16,  2,  7, 15, 11, 18, 15, 18, 16],
          [ 3, 18, 17,  3, 19, 15,  6,  3,  8, 18],
          [15,  5, 10, 17, 13,  6,  3, 19,  5, 10]], dtype=int64) 

我想使用种子为5的生成器在这个矩阵中添加10个零。 我考虑创建一个新的数组,维度为[5,10],里面放入10个零和其余位置为1,然后将两个数组相乘,但由于必须使用生成器,所以我无法这样做。
3个回答

2

使用 np.random.choice 选择索引,然后将这些索引对应的值设置为 0

np.random.seed(10)
idx = np.random.choice(np.arange(5*10), size=5, replace=False)

rng.ravel()[idx] = 0

输出:

array([[15, 19,  6,  4, 16, 16, 10,  3, 16, 10],
       [ 3,  3,  8, 14,  8, 16,  1,  9, 10, 19],
       [ 5, 16,  2,  0, 15, 11, 18, 15, 18, 16],
       [ 3, 18, 17,  3, 19, 15,  6,  0,  8, 18],
       [15,  5,  0, 17,  0,  6,  3,  0,  5, 10]])

@LefterisKyprianou 注意replace=False选项。默认情况下为True - Quang Hoang
无论替换是true还是false,结果都相同。 - Lefteris Kyprianou
如果是这样的话,那肯定是个 bug。你能提供一个可重现的例子吗? - Quang Hoang
因为我的idx中出现了15五次,所以我只取6个零而不是10个。`[10 17 3 6 15 15 15 16 15 15]array([[15, 19, 6, 0, 16, 16, 0, 3, 16, 10], [ 0, 3, 8, 14, 8, 0, 0, 0, 10, 19], [ 5, 16, 2, 7, 15, 11, 18, 15, 18, 16], [ 3, 18, 17, 3, 19, 15, 6, 3, 8, 18], [15, 5, 10, 17, 13, 6, 3, 19, 5, 10]], dtype=int64)` - Lefteris Kyprianou
我在下面放置了相同的代码,并使用易读的语法。 - Lefteris Kyprianou
显示剩余2条评论

0

当然

idx = np.random.choice(rng.ravel(), 10, replace= False)
print(idx)
rng.ravel()[idx] = 0
rng

输出

       [10 17  3  6 15 15 15 16 15 15]

array([[15, 19,  6,  0, 16, 16,  0,  3, 16, 10],
       [ 0,  3,  8, 14,  8,  0,  0,  0, 10, 19],
       [ 5, 16,  2,  7, 15, 11, 18, 15, 18, 16],
       [ 3, 18, 17,  3, 19, 15,  6,  3,  8, 18],
       [15,  5, 10, 17, 13,  6,  3, 19,  5, 10]], dtype=int64)

所以我只取了6个零,因为15在我的索引中出现了五次。


0
也许你可以试试这个:
import numpy as np
from numpy.random import default_rng

rng = default_rng(seed=10)
a=rng.integers(1,20,(5,10)) #creates the initial matrix
print("This is the initial matrix")
print(a)

rep= default_rng(seed=5)
row=rep.integers(0,5,(10,)) 
print("This is the random row index")
print(row)

column=rep.integers(0,10,(10,))
print("This is the random column index")
print(column)
a[row,column]=0 #set the random seats to 0

你会得到矩阵中的5个随机位置,将其替换为零(0)的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接