简单的用例,如果 numpy.delete() 不起作用



下面是一些代码:

c = np.delete(a,b)
print(len(a))
print(a)
print(len(b))
print(b)
print(len(c))
print(c)

它回馈:

24
[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55]
20
[46, 35, 37, 54, 40, 49, 34, 48, 50, 38, 42, 47, 33, 52, 41, 36, 39, 44, 55, 
51]
24
[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55]

如您所见,B 的所有元素都出现在 A 中,但没有被删除。 不知道为什么。有什么想法吗?谢谢。

numpy.delete

不会删除b中包含的元素,而是删除a[b],换句话说,b需要包含要删除的索引。由于b仅包含大于a长度的值,因此不会删除任何值。当前越界索引将被忽略,但将来不会如此:

/usr/local/bin/ipython3:1: DeprecationWarning: in the future out of bounds indices will raise an error instead of being ignored by `numpy.delete`.
#!/usr/bin/python3

一个纯粹的Python解决方案是使用set

set_b = set(b)
c = np.array([x for x in a if x not in set_b])
# array([32, 43, 45, 51, 53])

并使用numpy广播创建掩码以确定要删除哪些值:

c = a[~(a[None,:] == b[:, None]).any(axis=0)]
# array([32, 43, 45, 51, 53])

它们与给定示例的速度大致相同,但numpy方法并占用更多内存(因为它生成一个包含ab的所有组合的 2D 矩阵(。

最新更新