繁体   English   中英

Python:字典中numpy数组的有效串联

[英]Python: Efficient concatenation of numpy arrays in dictionaries

(使用Python 2.7)

注意:这与连接不同长度的numpy数组的字典非常相似(如果可能,请避免手动循环) 但是,我有一个稍微不同的用例:

总结问题:

我有一个字典的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”在极端情况下可能为空。另外,我可能有数百个要“连接”的字典,最后,链接的问题的键在一个字典中却不在另一个字典中,这在我的情况下是不可能的。

考虑到我需要为每个字典创建一个数据框,我想知道在这些情况下,Panda Dataframe方法是否仍然是最好的方法,而最终结果将是一个具有NaN的LOTS的数据框。

谢谢!

如果可以将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]})

我会遍历键,而不是遍历字典。 这将允许您使用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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM