我有一个大的稀疏矩阵,其每一行包含多个非零元素,例如
a = np.array([[1, 1,0,0,0,0], [2,0, 1,0,2,0], [3,0,4,0,0, 3]])
我希望能够在没有 for 循环的情况下每行随机选择一个非零元素。有什么好的建议吗?作为输出,我对所选元素的索引比它的值更感兴趣。
我有一个大的稀疏矩阵,其每一行包含多个非零元素,例如
a = np.array([[1, 1,0,0,0,0], [2,0, 1,0,2,0], [3,0,4,0,0, 3]])
我希望能够在没有 for 循环的情况下每行随机选择一个非零元素。有什么好的建议吗?作为输出,我对所选元素的索引比它的值更感兴趣。
使用numpy array例如:
arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])
你可以这样做arr != 0,这将给出一个通过条件的值True,False 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 comprehension对row你的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()
这给出tuple了indexes一个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]])
希望这能满足你现在的要求:)