python中的稀疏向量?

时间:2015-07-30 19:39:33

标签: python python-2.7

稀疏向量是一个向量几乎全为零的向量,如[1, 0, 0, 0, 0, 0, 0, 2, 0]。存储所有那些零浪费内存和字典通常用于跟踪非零条目。例如,前面显示的向量可以表示为{0:1, 7:2},因为它要表示的向量在索引1处具有值0而在索引处具有值2 7。编写一个将稀疏向量转换为字典的函数,如上所述。

实施例

>>> convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4])
{0: 1, 3: 2, 7: 3, 12: 4}
>>> convertVector([1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0])
{0: 1, 2: 1, 4: 2, 6: 1, 9: 1}
>>> convertVector([0, 0, 0, 0, 0])
{}

我的代码

def convertVector(numbers):
    d = {i: 0 for i in numbers}
    for k, c in enumerate(numbers):
        d[c] = k  # increment its value

    return d
print convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4])
print convertVector([1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0])
print convertVector([0, 0, 0, 0, 0])

代码将其作为

返回
{0: 11, 1: 0, 2: 3, 3: 7, 4: 12}
{0: 10, 1: 9, 2: 4}
{0: 4}

问题是它返回最后一个索引,对应于该值。应该返回的地方

   {0: 1, 3: 2, 7: 3, 12: 4}
    {0: 1, 2: 1, 4: 2, 6: 1, 9: 1}
    {}

任何帮助?

5 个答案:

答案 0 :(得分:3)

def convertVector(numbers):
    d = {}
    for k, c in enumerate(numbers):
        if c:
            d[k] = c  
    return d

print convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4])
print convertVector([1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0])
print convertVector([0, 0, 0, 0, 0])

答案 1 :(得分:2)

使用条件字典理解的单行:

def sparseVector(v): 
    return {n: val for n, val in enumerate(v) if val}

 v1 = [1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4]
 v2 = [1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0]
 v3 = [0, 0, 0, 0, 0]

 >>> [sparseVector(v) for v in [v1, v2, v3]]
 [{0: 1, 3: 2, 7: 3, 12: 4}, 
  {0: 1, 2: 1, 4: 2, 6: 1, 9: 1}, 
  {}]
压缩结束时的

if val意味着如果val不计算为False(即它不是0,None等),它只会将键和值添加到字典中。

enumerate(v)遍历可迭代对象(例如列表)并返回其索引值以及该位置的对象/值。

n: val将值添加到键入索引值n的字典中(仅当val不为零/无时)。

答案 2 :(得分:1)

你的钥匙都错了。你现在拥有的是values in input -> last index that value appears字典。你想要得到的是values in input: count of each value的字典。两者都不是稀疏列表(要获得第二个,请将d[c] = k更改为d[c] += 1)。

然而,你走在正确的轨道上。您需要做的是浏览输入列表,跟踪您所在的索引和该索引处的数字。 enumerate()非常适合这一点。但是,你需要做的是有一个index in original list: value at that index的字典,其中值不是0.试着仔细考虑你的每个变量意味着什么,以及结果结果如何成为。

我会帮助你更多(事实上,你可以在single dictionary comprehension中完成这个),但这看起来像是一个家庭作业问题(即使不是,也有很多价值)通过自己解决这个问题),所以我对发表一个完整的答案表示怀疑。

答案 3 :(得分:1)

def convertVector(numbers):
    dic = {}    
    for i in range(len(numbers)):
        if numbers[i] != 0:
            dic[i] = numbers[i]
    return dic

答案 4 :(得分:0)

看看人们给你的一些很棒的建议。解决问题的一种方法是:

    def convertVector(numbers):
        Value = []
        for number, w in enumerate(numbers):
            if w != 0:
                Value.append((number, w))
        return dict(Value)