Python:字典中numpy数组的高效连接

时间:2014-02-11 12:18:42

标签: python numpy pandas multidimensional-array

(使用Python 2.7)

注意:这是与Concatenating dictionaries of numpy arrays of different lengths (avoiding manual loops if possible)非常相似的问题。但是,我的用例略有不同:

总结问题:

我有一个numpy字典数组在结构上完全相同(意味着它们都有相同的键)包含可变长度的numpy数组(包括空)。嵌套数据结构FTW!

我想要的是一个“合并”字典,其中对于每个键,所有numpy数组都连接在一起。

例如:

source = [{"a":numpy.array([1,2,3]),"b":numpy.array(['a','b','c'])},{"a":numpy.array([4,5]),"b":numpy.array(['d','e','f','g','h'])}]
# Perform magic here into result
result = {"a":numpy.array([1,2,3,4,5]),"b":numpy.array(['a','b','c','d','e','f','g','h'])}

我可以遍历每个字典并使用numpy.append(),但我认为因为这是Python和Numpy,应该有一个更优雅的解决方案使用某种切片?

与上述相似问题的区别:

似乎在链接的问题中只有几个词典,并且键在语义上是链接的。例如,在数据集0中,键“a”为1,键“b”为“a”,键“c”为NaN,依此类推。但在我的情况下,“之间没有连接”事实上,大多数熊猫表都是由带有NaN的数据集组成的。连接的“a”可能有一万个条目,而连接的“b”在极端情况下可能是空的。此外,我可能有数百个词典,我想“连接”。最后,链接的问题有一个字典中存在的键,而另一个字典中没有。这在我的情况下是不可能的。

我想知道,鉴于这些情况,如果熊猫数据帧方法仍然是最好的方法,考虑到我需要为每个字典创建一个数据帧,最终结果将是一个具有大量NaN的数据帧

谢谢!

2 个答案:

答案 0 :(得分:1)

如果可以将NumPy数组转换为Python列表,那么您可以使用collections.Counter

In [15]: from collections import Counter                                                         

In [16]: source_ = [{"a":[1,2,3],"b":['a','b','c']}, 
                    {"a": [4,5], "b":['d','e','f','g','h']}]

In [17]: sum((Counter(x) for x in source_), Counter())                                           
Out[17]: Counter({'b': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
                  'a': [1, 2, 3, 4, 5]})

答案 1 :(得分:1)

我会遍历键而不是迭代字典。这将允许您使用numpy.concatenate,这比numpy.append更适合此情况,我认为它更容易阅读。如果有一个内置的numpy,我会感到惊讶,即使有,我认为它不会对可读性或性能做太多。

source = [{"a":numpy.array([1,2,3]),"b":numpy.array(['a','b','c'])}, 
          {"a":numpy.array([4,5]),"b":numpy.array(['d','e','f','g','h'])}]
result = {}
for key in source[0]:
    result[key] = numpy.concatenate([d[key] for d in source])