【问题标题】:Make numpy matrix more sparse使 numpy 矩阵更稀疏
【发布时间】:2017-08-26 19:56:45
【问题描述】:

假设我有一个 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],
])

【问题讨论】:

  • 生成mcve?
  • 如果您有 MovieLens100K 数据集,则可以运行此代码。从这里下载 files.grouplens.org/datasets/movielens/ml-100k.zip
  • 没有。 您需要提供minimal reproducible example
  • 这是可以验证的。
  • 它既不是最小的也不是完整的。

标签: python numpy matrix recommendation-engine


【解决方案1】:

我们可以使用np.random.choice(..., replace=False) 随机选择一些唯一的非零扁平索引,然后简单地索引并重置输入数组中的索引。

因此,一种解决方案是 -

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]])

【讨论】:

  • 那太好了。
  • @partoftheorigin 如果R 是您的输入数组,只需执行np.put(R, np.random.choice(idx, n, replace=0),0)。不要这样做:a = np.put(R..)。我假设a 作为输入数组。最终结果将是更稀疏的R
  • 谢谢你,迪瓦卡!
【解决方案2】:

使用np.ravelravel 方法来创建扁平化。请注意,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

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2021-11-25
    • 2016-08-26
    • 2013-11-10
    • 2018-02-22
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多