Numpy 稀疏矩阵每行1个

Numpy 稀疏矩阵每行1个,numpy,Numpy,我想生成一个随机矩阵MxN,其中每一行都只有一个处于随机位置的行。 例如,我想要这样一个矩阵: Out[3]: array([[1, 0, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [0, 0, 1]]) 我试过了 M = 5 N = 3 arr = np.array([1] + [0] * (N-1)) arr = np.tile(arr,(M,1)) np.random.shuffle(arr)

我想生成一个随机矩阵
MxN
,其中每一行都只有一个处于随机位置的行。 例如,我想要这样一个矩阵:

Out[3]: 
array([[1, 0, 0],
       [0, 1, 0],
       [0, 1, 0],
       [1, 0, 0],
       [0, 0, 1]])
我试过了

M = 5
N = 3
arr = np.array([1]   + [0] * (N-1)) 
arr = np.tile(arr,(M,1))
np.random.shuffle(arr) 
但它给出了:

Out[75]: 
array([[1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0]])

也许有一种更优雅的方法可以做到这一点,但它是有效的:

def randOne():
    M = 5
    N = 3
    arr = np.zeros((M, N))
    for row in range(M):
        arr[row, np.random.randint(N)] = 1
    return arr


>>> randOne() array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  1.,  0.],
       [ 1.,  0.,  0.]])
或 是的,有一种更优雅的方法可以做到这一点;)


fs我必须生成的随机双流,比如1111000111010110000,也就是说,连续双流的数量是随机的,这取决于你需要做的事情的时间,比如
ones=np.random.randint(7)'1'*ones+'0'*(7-ones)
def randOne2(M=5, N=3): 
    arr = np.zeros((M, N), dtype=np.int8)
    arr[np.arange(M),np.random.randint(0,N,M)] = 1
    return arr


>>> randOne2()
array([[0, 0, 1],
       [1, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [1, 0, 0]], dtype=int8)