我有一个相对稀疏的数组,我想遍历每一行并只打乱非零元素。
示例输入:
[2,3,1,0]
[0,0,2,1]
示例输出:
[2,1,3,0]
[0,0,1,2]
注意零点如何没有改变位置。
要打乱每行中的所有元素(包括零),我可以这样做:
for i in range(len(X)):
np.random.shuffle(X[i, :])
然后我尝试做的是:
for i in range(len(X)):
np.random.shuffle(X[i, np.nonzero(X[i, :])])
但它没有效果。我注意到 X[i, np.nonzero(X[i, :])]
的返回类型与 X[i, :]
不同,这可能成为
原因。
In[30]: X[i, np.nonzero(X[i, :])]
Out[30]: array([[23, 5, 29, 11, 17]])
In[31]: X[i, :]
Out[31]: array([23, 5, 29, 11, 17])
最佳答案
您可以使用非就地 numpy.random.permutation
显式非零索引:
>>> X = np.array([[2,3,1,0], [0,0,2,1]])
>>> for i in range(len(X)):
... idx = np.nonzero(X[i])
... X[i][idx] = np.random.permutation(X[i][idx])
...
>>> X
array([[3, 2, 1, 0],
[0, 0, 2, 1]])
关于python - 洗牌数组中每一行的非零元素 - Python/NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45764955/