python - 洗牌数组中每一行的非零元素 - Python/NumPy

标签 python numpy vectorization shuffle

我有一个相对稀疏的数组,我想遍历每一行并只打乱非零元素。

示例输入:

[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/

相关文章:

Python 3.4 类型错误 : argument of type 'int' is not iterable

python - Django Admin 内联 OneToOne 字段

python - IO.UnsupportedOperation : Not Writable

python - 使用 f2py 从 Fortran 修改 Numpy 字符串数组

python - 对点 block 进行采样

python - 带外积的矢量化和约简 - NumPy

python - 如何将带有日期索引和 int 值元组的 csv 文件转换为适合绘图的字典?

python-3.x - 如何对数组列表中的所有数组求和?

python - .flat 在 numpy 中的意义是什么?

r - R中的子集列表