您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

按值从多维numpy数组中删除元素

按值从多维numpy数组中删除元素

您可能会考虑的另一种方法

def iterative_numpy(a):
    mask = a != 1
    out = np.array([ a[i,mask[i]] for i xrange(a.shape[0]) ])
    return out

Divakar的方法loop_compr_based计算沿掩码行的总和以及该结果的累积总和。此方法避免了此类求和, 仍必须遍历的行a。它还返回一个数组数组。这种烦恼out必须用语法out[1][2]而不是索引out[1,2]。将时间与矩阵随机整数矩阵进行比较:

In [4]: a = np.random.random_integers(-1,1, size = (3,30))

In [5]: %timeit iterative_numpy(a)
100000 loops, best of 3: 11.1 us per loop

In [6]: %timeit loop_compr_based(a)
10000 loops, best of 3: 20.2 us per loop

In [7]: a = np.random.random_integers(-1,1, size = (30,3))

In [8]: %timeit iterative_numpy(a)
10000 loops, best of 3: 59.5 us per loop

In [9]: %timeit loop_compr_based(a)
10000 loops, best of 3: 30.8 us per loop

In [10]: a = np.random.random_integers(-1,1, size = (30,30))

In [11]: %timeit iterative_numpy(a)
10000 loops, best of 3: 64.6 us per loop

In [12]: %timeit loop_compr_based(a)
10000 loops, best of 3: 36 us per loop

如果列多于行,则iterative_numpy胜出。当行数多于列数时,loop_compr_based取胜但a先移置将提高两种方法性能。当尺寸比较相同时,loop_compr_based最好。

在实现之外,需要特别注意的是,任何形状不均匀的numpy数组 是实际的数组,因为这些值不会占用内存的连续部分,而且,通常的数组操作将无法正常工作。预期。

举个例子:

>>> a = np.array([[1,2,3],[1,2],[1]])
>>> a*2
array([[1, 2, 3, 1, 2, 3], [1, 2, 1, 2], [1, 1]], dtype=object)

注意,numpy实际上通知我们这不是带有note的通常的numpy数组dtype=object

因此,最好只 列出 一个numpy数组并相应地使用它们。

其他 2022/1/1 18:34:01 有472人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶