在python中,如何使用out for循环从稀疏矩阵中随机选择每行一个非零元素
例如,我有一个大型稀疏矩阵,其每行包含多个非零元素在python中,如何使用out for循环从稀疏矩阵中随机选择每行一个非零元素,python,sparse-matrix,zero,rowwise,Python,Sparse Matrix,Zero,Rowwise,例如,我有一个大型稀疏矩阵,其每行包含多个非零元素 a = np.array([[1, 1,0,0,0,0], [2,0, 1,0,2,0], [3,0,4,0,0, 3]]) 我希望能够在没有for循环的情况下,每行随机选择一个非零元素。有什么好建议吗?作为输出,我对所选元素的索引比对其值更感兴趣。使用numpy数组,例如: arr = np.array([5, 2, 6, 0, 2, 0, 0, 6]) 您可以执行arr!=0这将给出通过条件的值的True/False数组,因此在本例中,
a = np.array([[1, 1,0,0,0,0], [2,0, 1,0,2,0], [3,0,4,0,0, 3]])
我希望能够在没有for循环的情况下,每行随机选择一个非零元素。有什么好建议吗?作为输出,我对所选元素的索引比对其值更感兴趣。使用
numpy
数组
,例如:
arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])
您可以执行arr!=0
这将给出通过条件的值的True
/False
数组
,因此在本例中,值与0
不相等(!=
)。因此:
array([ True, True, True, False, True, False, False, True], dtype=bool)
从这里,我们可以通过执行arr[arr!=0
]来'index'
使用此布尔值数组
,这为我们提供了:
array([5, 2, 6, 2, 6])
现在我们有了一种从numpy
数组
中删除非零
值的方法,我们可以对数组
中的每个行
进行简单的列表理解。对于每个行
,我们删除零
,然后在数组
上执行随机选择。因此:
np.array([np.random.choice(r[r!=0]) for r in a])
这将返回一个长度3
数组,其中包含随机非零项,这些项来自a
中的每个行
:)
希望这有帮助
更新
如果需要数组中随机非零
数字的索引
,可以使用.nonzero()
所以如果我们有这个数组
:
arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])
我们可以做到:
arr.nonzero()
它给出了非零元素的索引的元组:
(array([0, 1, 2, 4, 7]),)
与以前一样,我们可以在列表理解中使用此和np.random.choice()
来生成随机索引:
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])
它返回[x,y,z]
形式的数组
,其中x
,y
和z
是随机的索引
,其中元素来自其相应的行
例如,一个结果可能是:
array([1, 4, 2])
([array([0, 1, 2])], array([1, 2, 5]))
如果您想让它也返回行
,只需添加numpy.arrange()
调用a的长度
即可获得行
的数组
:
([np.arange(len(a))], np.array([np.random.choice(r.nonzero()[0]) for r in a]))
因此,random
输出可以是:
array([1, 4, 2])
([array([0, 1, 2])], array([1, 2, 5]))
对于a
as:
array([[1, 1, 0, 0, 0, 0],
[2, 0, 1, 0, 2, 0],
[3, 0, 4, 0, 0, 3]])
希望这能满足您现在的需求。:)使用numpy
数组
,例如:
arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])
您可以执行arr!=0
这将给出通过条件的值的True
/False
数组
,因此在本例中,值与0
不相等(!=
)。因此:
array([ True, True, True, False, True, False, False, True], dtype=bool)
从这里,我们可以通过执行arr[arr!=0
]来'index'
使用此布尔值数组
,这为我们提供了:
array([5, 2, 6, 2, 6])
现在我们有了一种从numpy
数组
中删除非零
值的方法,我们可以对数组
中的每个行
进行简单的列表理解。对于每个行
,我们删除零
,然后在数组
上执行随机选择。因此:
np.array([np.random.choice(r[r!=0]) for r in a])
这将返回一个长度3
数组,其中包含随机非零项,这些项来自a
中的每个行
:)
希望这有帮助
更新
如果需要数组中随机非零
数字的索引
,可以使用.nonzero()
所以如果我们有这个数组
:
arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])
我们可以做到:
arr.nonzero()
它给出了非零元素的索引的元组:
(array([0, 1, 2, 4, 7]),)
与以前一样,我们可以在列表理解中使用此和np.random.choice()
来生成随机索引:
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])
它返回[x,y,z]
形式的数组
,其中x
,y
和z
是随机的索引
,其中元素来自其相应的行
例如,一个结果可能是:
array([1, 4, 2])
([array([0, 1, 2])], array([1, 2, 5]))
如果您想让它也返回行
,只需添加numpy.arrange()
调用a的长度
即可获得行
的数组
:
([np.arange(len(a))], np.array([np.random.choice(r.nonzero()[0]) for r in a]))
因此,random
输出可以是:
array([1, 4, 2])
([array([0, 1, 2])], array([1, 2, 5]))
对于a
as:
array([[1, 1, 0, 0, 0, 0],
[2, 0, 1, 0, 2, 0],
[3, 0, 4, 0, 0, 3]])
希望这能满足您的需要。:)请添加您尝试过的内容。我使用了numpy.nonzero命令但无法摆脱for循环。请添加您尝试过的内容。我使用了numpy.nonzero命令但无法摆脱for循环。谢谢您,Joe,这非常有帮助。我对非零元素的索引更感兴趣,因此感兴趣的输出将是非零元素的索引(每行一个非零元素)@aminamollaysa,因为您有一个二维数组,您希望索引如何?作为元组
?价值观本身?哦,我知道你是这个网站的新手,但是如果这个答案有帮助,你可以通过向上投票(小箭头)来显示:)是的,如果我们每行随机选择一个元素,我希望输出是所选元素的索引,例如:输出可以是[c,d],其中c=[0,1,2](行索引,这实际上很明显)d=[0,4,2](列索引),简单地说,我只需要列索引,因为我们为每行选择了一个元素。@aminamollaysa我现在使用.nonzero()
更新了答案。它现在应该做你想做的事了Jo