【问题标题】:numpy selecting every other n entriesnumpy 每隔 n 个条目选择一次
【发布时间】:2015-09-18 21:31:10
【问题描述】:

有没有人知道一种聪明的方法来选择一个 numpy 数组中的每组 n 个条目?例如,这里我想选择所有“唯一”条目 0、1、4、5、8、9 等(n=2)而不诉诸排序:

[[ 0  2]
 [ 1  3]
 [ 2  0]
 [ 3  1]
 [ 4  6]
 [ 5  7]
 [ 6  4]
 [ 7  5]
 [ 8 10]
 [ 9 11]
 [10  8]
 [11  9]
 [12 14]
 [13 15]
 [14 12]
 [15 13]]

事先构建索引数组是一种选择,但我想知道是否有人有更好的主意!

【问题讨论】:

  • 你能给出一个期望输出的样本吗?
  • 这是 unutbu 提供的。

标签: python arrays numpy indexing


【解决方案1】:

您可以重塑数组以添加长度为 2 的额外维度:

In [10]: x.reshape(-1,2,2)
Out[10]: 
array([[[ 0,  2],
        [ 1,  3]],

       [[ 2,  0],
        [ 3,  1]],

       [[ 4,  6],
        [ 5,  7]],

       [[ 6,  4],
        [ 7,  5]],

       [[ 8, 10],
        [ 9, 11]],

       [[10,  8],
        [11,  9]],

       [[12, 14],
        [13, 15]],

       [[14, 12],
        [15, 13]]])

然后选择沿第一个轴的所有其他项目:

In [11]: x.reshape(-1,2,2)[::2]
Out[11]: 
array([[[ 0,  2],
        [ 1,  3]],

       [[ 4,  6],
        [ 5,  7]],

       [[ 8, 10],
        [ 9, 11]],

       [[12, 14],
        [13, 15]]])

最后将其重新整形为二维数组:

In [12]: x.reshape(-1,2,2)[::2].reshape(-1,2)
Out[12]: 
array([[ 0,  2],
       [ 1,  3],
       [ 4,  6],
       [ 5,  7],
       [ 8, 10],
       [ 9, 11],
       [12, 14],
       [13, 15]])

【讨论】:

  • 这很好用!没想到重塑会是一个如此有用的工具 :-) 谢谢。
【解决方案2】:

让 l = 你的原始列表,那么你想要的是:

[x for i, x in enumerate(l) if (i // 2) % 2 == 0]

【讨论】:

  • 看起来真不错。列表理解看起来非常强大。但是看到我正在使用 numpy,我得到:[array([0, 4]), array([1, 5]) 等。有什么想法吗?我可以改用普通数组,但如果可能的话,我宁愿不要。
  • 尝试在最后转换回 np.array:array([x for i, x in enumerate(l) if (i // 2) % 2 == 0])
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
相关资源
最近更新 更多