从np.where获得的元组位置的随机值到矩阵(np.ndarray)

时间:2017-06-01 04:06:07

标签: python numpy matrix

我有一个零

的矩阵
x=np.array([[1,2,3,0],[4,0,5,0],[7,0,0,0],[0,9,8,0]])
>>> x
array([[1, 2, 3, 0],
       [4, 0, 5, 0],
       [7, 0, 0, 0],
       [0, 9, 8, 0]])

并且想要将随机值仅放入非零的位置。我可以从np.where

获得(row,col)位置作为元组
pos = np.where(x!=0)
>>> (array([0, 0, 0, 1, 1, 2, 3, 3], dtype=int64), array([0, 1, 2, 0, 2, 0, 1, 2], dtype=int64))

有没有办法在np.random的位置使用x(或其他内容)作为矩阵pos,而不更改哪里为零?

# pseudocode
new_x = np.rand(x, at pos)

5 个答案:

答案 0 :(得分:2)

我假设你想用随机整数替换非零值。

您可以使用numpy.placenumpy.random.randint功能的组合。

>>> x=np.array([[1,2,3,0],[4,0,5,0],[7,0,0,0],[0,9,8,0]])
>>> x
array([[1, 2, 3, 0],
       [4, 0, 5, 0],
       [7, 0, 0, 0],
       [0, 9, 8, 0]])
>>> lower_bound, upper_bound = 1, 5 # random function boundary
>>> np.place(x, x!=0, np.random.randint(lower_bound, upper_bound, np.count_nonzero(x)))
>>> x
array([[2, 2, 3, 0],
       [1, 0, 3, 0],
       [2, 0, 0, 0],
       [0, 4, 3, 0]])

答案 1 :(得分:1)

如此简单的事情:

import numpy as np
x = np.array([[1, 2, 3, 0], [4, 0, 5, 0], [7, 0, 0, 0], [0, 9, 8, 0]])
w = x != 0
x[w] = np.random.randint(10, size=x.shape)[w]
print(x)

[[2 2 2 0]
 [0 0 4 0]
 [1 0 0 0]
 [0 3 1 0]]

答案 2 :(得分:1)

您也可以

x = np.random.randint(1, 10, size=x.shape) * (x != 0)

答案 3 :(得分:1)

只需使用np.nonzero

进行索引
i = np.nonzero(x)
x[i] = np.random.randint(1, 10, i[0].size)

请注意np.nonzero(x)< => np.where(x)< => np.where(x != 0)

答案 4 :(得分:1)

你可以使用x.nonzero()为你提供非零值的所有数组索引

然后你只需要在这些索引上放置随机值

nz_indices = x.nonzero()
for i,j in zip(nz_indices[0],nz_indices[1]):
    x[i][j] = np.random.randint(1500) #random number till 1500
  

你可以在这里找到关于randint()的更多信息>> randint docs