我有一个 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)
无需循环。
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