我有一个零
的矩阵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)
答案 0 :(得分:2)
我假设你想用随机整数替换非零值。
您可以使用numpy.place和numpy.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