在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