我正在寻找一个函数来完成函数where
在以下假设代码中的作用:
>>> c='''<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>http://www.vudu.com/sitemap-static.xml</loc></sitemap>
</sitemapindex>'''
>>> node=etree.fromstring(c)
>>> node.xpath('//loc')
[]
{1:[(0,0)],2:[(0,1),(1,0)],3:[(0,2),(1,1)],4:[( 1,2)]}
具体来说,我想生成一个字典,其字符串是扁平数组中的唯一元素,其值是相应键的完整索引的列表。
我查看了node
函数,但它似乎没有为大型数组提供有效的解决方法。最好的方法是什么?
注意:我正在使用Python 2.7
答案 0 :(得分:1)
鉴于您所需的输出是字典,我认为通过NumPy操作,这将成为一种有效的方法。你最好的选择可能是
import collections
import itertools
d = collections.defaultdict(list)
for indices in itertools.product(*map(range, a.shape)):
d[a[indices]].append(indices)
答案 1 :(得分:0)
numpy_indexed包可以以高效且完全矢量化的方式执行这些分组操作,即:
import numpy_indexed as npi
a = np.array([[1, 2, 3], [2, 3, 4]])
keys, values = npi.group_by(a.reshape(-1), np.indices(a.shape).reshape(-1, a.ndim))
答案 2 :(得分:-1)
我不知道numpy,但如果只是使用数组,这是一个示例解决方案:
arrs = [[1, 2, 3], [2, 3, 4]]
dict = {}
for i in range(0, len(arrs)):
arr = arrs[i]
for j in range(0, len(arr)):
num = arr[j]
indices = dict.get(num)
if indices is None:
dict[num] = [(i, j)]
else:
dict[num].append((i, j))