我有一个大的稀疏矩阵,其每一行包含多个非零元素,例如
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
来自每个row
in的项目的数组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
的元素。z
random
indexes
non-zero
rows
例如,一个结果可能是:
array([1, 4, 2])
如果您希望它也返回rows
,您可以添加numpy.arrange()
对长度的调用以a
获取数字:array
row
([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]])
希望这能满足你现在的要求:)