用numpyarray 如:
arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])
你可以做arr != 0,这将给出一个True/Falsearray的通过条件的值,所以在我们的例子中,这些值不等于 (@987654328 @) 到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])
既然我们有办法从numpy array 中删除non-zero 值,我们可以在a array 中的每个row 上执行一个简单的list comprehension。对于每个row,我们删除zeros,然后对array 执行random.choice。因此:
np.array([np.random.choice(r[r!=0]) for r in a])
它会返回一个 length 3 数组,其中包含 a 中每个 row 中的 random non-zero 项。 :)
希望这会有所帮助!
更新
如果您想要random 中non-zero 数字中的indexes array,可以使用.nonzero()。
如果我们有这个array:
arr = np.array([5, 2, 6, 0, 2, 0, 0, 6])
我们可以做到:
arr.nonzero()
这给出了indexes 的non-zero 的tuple elements:
(array([0, 1, 2, 4, 7]),)
和以前一样,我们可以在list-comprehension 中使用这个和np.random.choice() 来产生随机的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])
它返回 [x, y, z] 形式的 array,其中 x、y 和 z 是 random indexes 的 non-zero 元素来自它们对应的 rows。
例如一个结果可能是:
array([1, 4, 2])
如果您希望它也返回 rows,您可以在 a 的长度上添加一个 numpy.arrange() 调用,以获得 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]])
希望这能满足你的需求:)