如何使用最小数量的交换来获得3个numpy数组之间的相同顺序?

问题描述 投票:0回答:1

免责声明

此问题(尽管相关)不是'how to swap rows in numpy array?'的重复项,而是如何根据最小交换次数来概括三个阵列之间的交换? (问题已在本文底部重述)。

Context

[访问​​CSSE COVID-19 Dataset时,我注意到三个可用的数据集(confirmeddeadrecovered)每天都在相同的日期和相同的位置进行。但是,recovered文件中的行与confirmeddead文件中提供的行的顺序不同。下图中的索引参考与前几天有所不同(因为数据集每天更新)。

考虑confirmed个案例的子集。

confirmed cases sub-table

并且为了比较,考虑recovered个案例的子集。

recovered cases sub-table

注意,confirmedrecovered情况下的行号和国家/省确实匹配-特别是在412413414行。 (dead案例的顺序未显示,因为它与confirmed案例的顺序匹配。)

这些事件的数量一直在减少-在此过程中,需要交换的行号也是如此。我想自动执行此行交换,以便可以同时遍历所有三个数据集(而不是分别遍历每个数据集)。这样,对于我来说,将每个时间序列按位置分组到字典中就比较容易了。

示例(MWE)

例如,假设我有以下格式的数据。请注意,cd的顺序相同,但是r的顺序应从0-1-3-4-20-1-2-3-4。因此,要交换的行索引为2, 3, 4

# confirmed
c = np.array([
['name', 'province', 'property', 'value t1', 'value t2', 'value t3'],
['USA', 'a', 0.5, 1, 2, 3],
['MEXICO', 'b', 0.2, 5, 10, 100],
['CHINA', 'c', 0.7, 3, 6, 9],
['RUSSIA', 'd', 0.4, 2, 3, 5]], dtype=str)

# dead
d = np.array([
['name', 'province', 'property', 'value t1', 'value t2', 'value t3'],
['USA', 'a', 0.5, 0, 1, 1],
['MEXICO', 'b', 0.2, 1, 5, 25],
['CHINA', 'c', 0.7, 0, 2, 4],
['RUSSIA', 'd', 0.4, 0, 0, 1]], dtype=str)

# recovered
r = np.array([
['name', 'province', 'property', 'value t1', 'value t2', 'value t3'],
['USA', 'a', 0.5, 0, 0, 1],
['CHINA', 'c', 0.7, 0, 0, 3],
['RUSSIA', 'd', 0.4, 0, 0, 2],
['MEXICO', 'b', 0.2, 0, 0, 0]], dtype=str)

我可以从这些数据集中确定要交换的行。

condition_cd = ((c[:, 0] != d[:, 0]) | (c[:, 1] != d[:, 1]))
condition_dr = ((d[:, 0] != r[:, 0]) | (d[:, 1] != r[:, 1]))
condition_rc = ((r[:, 0] != c[:, 0]) | (r[:, 1] != c[:, 1]))

print(condition_cd, np.any(condition_cd)) # [False False False False False] False
print(condition_dr, np.any(condition_dr)) # [False False  True  True  True] True
print(condition_rc, np.any(condition_rc)) # [False False  True  True  True] True
# True corresponds to indices 2, 3, 4

问题

但是,如果明天更新的数据的行号发生更改,以致上述条件不再相同,该怎么办?由于0c之间的差异(d)最少,因此我想根据r重新排序d。如果这个差异数为> 0,那么我将[[first重新排列d然后根据r重新排列d。最好的方法是什么?

python-3.x numpy multidimensional-array compare swap
1个回答
0
投票
Get free Robux儿童。
© www.soinside.com 2019 - 2024. All rights reserved.