【问题标题】:Jumping Multi-element slices in Numpy Arrays在 Numpy 数组中跳跃多元素切片
【发布时间】:2019-11-26 20:01:23
【问题描述】:

假设我有一个数组:

arr = np.arange(12)

最后我想要这个数组:

arr2 = [0,1,2,6,7,8]

所以我想要一个跳跃的多片,比如:

arr2 = arr[(0:2):-1:6]

其中第二个数组是一个 3 的切片,每次跳 6。 这在 numpy 中可行吗?

我的实际示例是一个更复杂的示例,其中一部分数学应用于跳转 6 的切片 (0:2),另一部分数学应用于切片 (3:5),目标是写入一个行,即没有 for 循环。

很抱歉,如果之前有人问过这个问题。我很难找到这方面的文档,我想我可能只是在谷歌上搜索错误的东西。谢谢!

【问题讨论】:

  • 你能详细说明complex example吗?你还在为那些而跳吗?
  • 跳跃长度除以总长度吗?
  • 跳转长度始终是切片长度的 2 倍。整个数组的长度约为 100 次。
  • 另外,复杂的例子是一个高斯运算符,其中两个切片的 sigma 值不同。跳跃的性质保持不变。

标签: python arrays numpy indexing


【解决方案1】:

你不能用切片表示法做到这一点,至少不能直接这样做。

但有一些重塑:

In [74]: arr = np.arange(12)                                                    
In [75]: arr.reshape(-1,3)                                                      
Out[75]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
In [76]: arr.reshape(-1,3)[::2,:]                                               
Out[76]: 
array([[0, 1, 2],
       [6, 7, 8]])
In [77]: _.reshape(-1)                                                          
Out[77]: array([0, 1, 2, 6, 7, 8])

单独切片和重塑制作views,但在此过渡的某个时刻,它必须制作副本。因此,Divakar 建议的与高级索引相关的时间充其量是适中的:

In [86]: timeit arr.reshape(-1,3)[::2,:].reshape(-1)                            
3.99 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [87]: timeit arr[(np.arange(len(arr))%6)<3]                                  
8.91 µs ± 89.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2021-11-23
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多