gpt4 book ai didi

python - 逐行比较二维数组

转载 作者:行者123 更新时间:2023-12-04 07:27:10 26 4
gpt4 key购买 nike

这个问题是由 3D 中非结构化网格的空间分析引起的。
我有 2 个 2D 数组要比较,每个数组有 3 列用于 xyz 坐标。
一个数组是一个引用,另一个是针对它进行评估的(它是针对引用数组的 CKde 树查询的结果)。最后我想要引用的匹配行数。
我试图找到一个数组连接解决方​​案,但我在不同的维度中迷失了方向

reference=np.array([[0,1,33],[0,33,36],[0,2,36],[1, 33, 34]])
query= np.array([[0,1,33],[0,1,33],[1, 33, 34],[0,33,36],[0,33,36],[0,1,33],[0,33,36]])
风格中的某些东西是我要去的地方
filter=reference[:,:,None]==query.all(axis=0)
result = filter.sum(axis=1)
但我找不到正确的广播方式来比较 2 个数组的行。
结果应该是:
np.array([3,3,0,1])

最佳答案

您需要广播这两个数组。由于无法直接比较一维数组,因此首先需要使用 all 进行归约。在最后一个维度上。然后你可以用 sum sum 来计算匹配的行数.这是结果代码:

(reference[None,:,:] == query[:,None,:]).all(axis=2).sum(axis=0)

话虽如此,这个解决方案对于更大的阵列并不是最有效的。确实为 m大小行 nreferencek query 中的行,解的复杂度为 O(n m k)而最优解是 O(n m + n k) .这可以使用哈希映射(又名 dict)来实现。这个想法是放置 reference 行哈希映射中的数组,关联值设置为 0,然后对于 query 的每个值增加哈希映射的值,键设置为 query 的行.只需遍历哈希映射即可获得最终数组。哈希映射访问是在(摊销的)恒定时间内完成的。不幸的是,Python dict 不支持数组作为键,因为数组不能被散列,但元组可以。下面是一个例子:
counts = {tuple(row):0 for row in reference}

for row in query:
key = tuple(row)
if key in counts:
counts[key] += 1

print(list(counts.values()))
结果打印: [3, 3, 0, 1] .
请注意,哈希映射中的顺序通常不保守,但对于 Python dict 来说应该没问题。或者,可以使用另一个哈希映射来重建最终数组。
对于小型阵列,最终的解决方案可能会更慢,但对于大型阵列应该会更好。

关于python - 逐行比较二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68152637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com