1

我有一个大的稀疏矩阵,其每一行包含多个非零元素,例如

a = np.array([[1, 1,0,0,0,0], [2,0, 1,0,2,0], [3,0,4,0,0, 3]])

我希望能够在没有 for 循环的情况下每行随机选择一个非零元素。有什么好的建议吗?作为输出,我对所选元素的索引比它的值更感兴趣。

4

1 回答 1

0

使用numpy array例如:

arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])

你可以这样做arr != 0,这将给出一个通过条件的值TrueFalse array所以在我们的例子中,值不等于( !=) 到0。所以:

array([ True,  True,  True, False,  True, False, False,  True], dtype=bool)

从这里开始,我们可以'index' arr通过] 来boolean array实现arr[arr != 0,这给了我们:

array([5, 2, 6, 2, 6])

所以现在我们有了一种non-zero从 a 中删除值的方法numpy array,我们可以list comprehensionrow你的a array. 对于每个row,我们删除zeros,然后random.choice对执行 a array。如此:

np.array([np.random.choice(r[r!=0]) for r in a])

length 3它为您返回一个包含random non-zero来自每个rowin的项目的数组a:)

希望这可以帮助!

更新

如果你想要indexes中的random non-zero数字array,你可以使用.nonzero().

所以如果我们有这个array

arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])

我们可以做的:

arr.nonzero()

这给出tupleindexes一个non-zero elements

(array([0, 1, 2, 4, 7]),)

和以前一样,我们可以使用它并np.random.choice()在 alist-comprehension中产生随机数indexes

a = np.array([[1, 1, 0, 0, 0, 0], [2, 0, 1, 0, 2, 0], [3, 0, 4, 0, 0, 3]])

np.array([np.random.choice(r.nonzero()[0]) for r in a])

它返回array形式[x, y, z]wherex和are来自其对应y的元素。zrandom indexesnon-zerorows

例如,一个结果可能是:

array([1, 4, 2])

如果您希望它也返回rows,您可以添加numpy.arrange()对长度的调用以a获取数字:arrayrow

([np.arange(len(a))], np.array([np.random.choice(r.nonzero()[0]) for r in a]))

所以一个示例random输出可能是:

([array([0, 1, 2])], array([1, 2, 5]))

a

array([[1, 1, 0, 0, 0, 0],
       [2, 0, 1, 0, 2, 0],
       [3, 0, 4, 0, 0, 3]])

希望这能满足你现在的要求:)

于 2017-10-03T16:12:47.253 回答