如何使用 NumPy 将重复条目从第二次出现开始标记为 True?

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

问题

我有一个 NumPy 数组,需要识别重复元素,将第二次出现及之后的元素标记为

True
,同时将第一次出现标记为
False

例如,给定以下数组:

np.random.seed(100)
a = np.random.randint(0, 5, 10)
# Output: [0 0 3 0 2 4 2 2 2 2]

我想得到以下输出:

[False True False True False False True True True True]

如何仅使用 NumPy 函数来实现此目的,而不使用任何循环或额外的库?

您尝试了什么以及您期待什么?

我能够让它通过循环工作,但我想仅使用 NumPy 函数来解决它。我尝试用蒙版实现

np.cumsum
,但没有取得太大进展。

这是我使用一个循环想出的解决方案:

np.random.seed(100)
a = np.random.randint(0, 5, 10)
print(a)
uniques, first_indices = np.unique(a, return_index=True)
all_occurrences = np.zeros_like(a, dtype=bool)
for i in range(len(a)):
    all_occurrences[i] = np.any(a[:i] == a[i])

all_occurrences[first_indices] = False
print(all_occurrences)
python arrays algorithm numpy numpy-ndarray
1个回答
0
投票

无需循环。

np.unique(a, return_index=True)
查找所有唯一元素及其第一个索引。

np.cumsum(a[:, None] == unique_elements, axis=0)
累计计算每个元素的出现次数。

first_indices
确保每个元素的第一次出现被标记为 False

对于空数组,我们直接返回一个空的布尔数组以防止错误(Edge case)

def find_repeated_mask(a):
    if a.size == 0:  # Handle empty array edge case
        return np.array([], dtype=bool)

    # Find unique elements and their first occurrence indices
    unique_elements, first_indices = np.unique(a, return_index=True)

    # Create a mask to identify repeated elements
    repeated_mask = np.zeros_like(a, dtype=bool)

    # Mark repeated elements as True
    repeated_mask[np.cumsum(a[:, None] == unique_elements, axis=0).max(axis=1) > 1] = True

    # Ensure the first occurrences are marked as False
    repeated_mask[first_indices] = False

    return repeated_mask

测试用例:

Test case 1 - Input: [0 0 3 0 2 4 2 2 2 2]
Expected: [False  True False  True False False  True  True  True  True]
Output:   [False  True False  True False False  True  True  True  True]
Pass:     True

Test case 2 - Input: [1 2 3 4 5]
Expected: [False False False False False]
Output:   [False False False False False]
Pass:     True

Test case 3 - Input: [7 7 7 7 7]
Expected: [False  True  True  True  True]
Output:   [False  True  True  True  True]
Pass:     True

Test case 4 - Input: [4 1 4 2 1 3 3 4]
Expected: [False False  True False  True False  True  True]
Output:   [False False  True False  True False  True  True]
Pass:     True

Test case 5 - Input: [8]
Expected: [False]
Output:   [False]
Pass:     True

Test case 6 - Input: []
Expected: []
Output:   []
Pass:     True
© www.soinside.com 2019 - 2024. All rights reserved.