使 numpy 矩阵更稀疏
Make numpy matrix more sparse
假设我有一个 numpy 数组
np.array([
[3, 0, 5, 3, 0, 1],
[0, 1, 2, 1, 5, 2],
[4, 3, 5, 3, 1, 4],
[2, 5, 2, 5, 3, 1],
[0, 1, 2, 1, 5, 2],
])
现在,我想用 0 随机替换一些元素。这样我就有这样的输出
np.array([
[3, 0, 0, 3, 0, 1],
[0, 1, 2, 0, 5, 2],
[0, 3, 0, 3, 1, 0],
[2, 0, 2, 5, 0, 1],
[0, 0, 2, 0, 5, 0],
])
我们可以使用 np.random.choice(..., replace=False)
随机 select 一些独特的非零扁平索引,然后简单地索引并重置输入数组中的索引。
因此,一种解决方案是 -
def make_more_sparsey(a, n):
# a is input array
# n is number of non-zero elements to be reset to zero
idx = np.flatnonzero(a) # for performance, use np.flatnonzero(a!=0)
np.put(a, np.random.choice(idx, n, replace=False),0)
return a
样本运行-
In [204]: R = np.array([
...: [3, 0, 5, 3, 0, 1],
...: [0, 1, 2, 1, 5, 2],
...: [4, 3, 5, 3, 1, 4],
...: [2, 5, 2, 5, 3, 1],
...: [0, 1, 2, 1, 5, 2],
...: ])
In [205]: make_more_sparsey(R, n=5)
Out[205]:
array([[3, 0, 5, 3, 0, 1],
[0, 1, 0, 0, 5, 2],
[4, 3, 5, 3, 1, 4],
[2, 5, 0, 5, 3, 1],
[0, 1, 0, 1, 0, 2]])
使用np.ravel
或ravel
方法创建扁平化。请注意,flatten
方法总是创建一个副本,因此变异将不起作用。
a = np.array([
[3, 0, 5, 3, 0, 1],
[0, 1, 2, 1, 5, 2],
[4, 3, 5, 3, 1, 4],
[2, 5, 2, 5, 3, 1],
[0, 1, 2, 1, 5, 2],
])
r = a.ravel()
r[random.randrange(0, len(r))] = 0
假设我有一个 numpy 数组
np.array([
[3, 0, 5, 3, 0, 1],
[0, 1, 2, 1, 5, 2],
[4, 3, 5, 3, 1, 4],
[2, 5, 2, 5, 3, 1],
[0, 1, 2, 1, 5, 2],
])
现在,我想用 0 随机替换一些元素。这样我就有这样的输出
np.array([
[3, 0, 0, 3, 0, 1],
[0, 1, 2, 0, 5, 2],
[0, 3, 0, 3, 1, 0],
[2, 0, 2, 5, 0, 1],
[0, 0, 2, 0, 5, 0],
])
我们可以使用 np.random.choice(..., replace=False)
随机 select 一些独特的非零扁平索引,然后简单地索引并重置输入数组中的索引。
因此,一种解决方案是 -
def make_more_sparsey(a, n):
# a is input array
# n is number of non-zero elements to be reset to zero
idx = np.flatnonzero(a) # for performance, use np.flatnonzero(a!=0)
np.put(a, np.random.choice(idx, n, replace=False),0)
return a
样本运行-
In [204]: R = np.array([
...: [3, 0, 5, 3, 0, 1],
...: [0, 1, 2, 1, 5, 2],
...: [4, 3, 5, 3, 1, 4],
...: [2, 5, 2, 5, 3, 1],
...: [0, 1, 2, 1, 5, 2],
...: ])
In [205]: make_more_sparsey(R, n=5)
Out[205]:
array([[3, 0, 5, 3, 0, 1],
[0, 1, 0, 0, 5, 2],
[4, 3, 5, 3, 1, 4],
[2, 5, 0, 5, 3, 1],
[0, 1, 0, 1, 0, 2]])
使用np.ravel
或ravel
方法创建扁平化。请注意,flatten
方法总是创建一个副本,因此变异将不起作用。
a = np.array([
[3, 0, 5, 3, 0, 1],
[0, 1, 2, 1, 5, 2],
[4, 3, 5, 3, 1, 4],
[2, 5, 2, 5, 3, 1],
[0, 1, 2, 1, 5, 2],
])
r = a.ravel()
r[random.randrange(0, len(r))] = 0