如何根据索引列表将numpy数组拆分为两个子数组

7fhtutme  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(176)

我有一个索引列表,需要将一个numpy数组拆分为两个基于它的子数组。一个子数组将是位于索引处的元素,另一个将是剩余的元素。任何人都可以推荐一种使用索引表示法的适当方法。
下面是一个例子

a = np.arange(10)
idx = np.random.choice(10, 3, replace=False)

有了这些数组,我想从a中随机选择三个元素以及其余元素。表达式a[idx]当然给出了第一部分,但a[~idx]是不正确的。必须有一种方法将数组idx转换为它的补码,对吗?

klsxnrf1

klsxnrf11#

您可以创建一个遮罩来选择元素,然后反转遮罩以选择互补元素:

a = np.arange(10)

idx = np.random.choice(10, 3, replace=False)
mask = np.zeros_like(a, dtype=bool)
mask[idx] = True

selected = a[mask]
unselected = a[~mask]

样本输出:

>>> selected
array([1, 3, 5])
>>> unselected
array([0, 2, 4, 6, 7, 8, 9])
jdzmm42g

jdzmm42g2#

您可以使用sets操作:

a = np.arange(10)
idx1 = np.random.choice(10, 3, replace=False)
idx2 = np.setdiff1d(np.arange(len(a)), idx1)

# Same as:
# idx2 = list(set(range(10)).difference(idx1))

输出:

>>> a[idx1]
array([2, 4, 8])

>>> a[idx2]
array([0, 1, 2, 3, 4, 6, 9])

相关问题