【问题标题】:numpy.array select all even elements from d-dimensional arraynumpy.array 从 d 维数组中选择所有偶数元素
【发布时间】:2017-06-09 22:15:41
【问题描述】:

是否有一种高效且 Python 的方法可以从 d 维数组中选择所有具有偶数索引的元素,而无需事先知道 d?以及所有剩余的(即所有至少有一个奇数索引的那些)?

第一个问题的最小示例

import numpy as np
a = np.array(range(27)).reshape((3,3,3))
a[::2,::2,::2] 
# -> array([[[ 0,  2],
#            [ 6,  8]],
#           [[18, 20],
#            [24, 26]]])

我为 d 维对象找到的唯一非 Pythonic 方式,d 是可变的 至少对于“全偶数”部分,“至少一个奇数”仍然无法理解。

d = 3
a = np.array(range(3**d)).reshape([3]*d)
b = a
for i in range(d):
    b = np.take(b, np.array(range(0,b.shape[i],2)), axis=i)

我问这个(可能已经有更高级别的解决方案)的原因是我想在 n 步中迭代地创建一个大小为 (2**n+1, ..., 2**n+1) 的大型 d 维对象,在每一步复制偶数- 前面步骤中的索引元素,例如:

for n in range(N):
    new_array = np.zeros([2**n+1]*d)
    new_array[all_even] = old_array
    new_array[at_least_one_odd] = #something else

提前感谢您的任何提示!

【问题讨论】:

    标签: python arrays numpy indexing slice


    【解决方案1】:

    我猜你可以使用切片对象。

    even = a[[slice(None, None, 2) for _ in range(a.ndim)]]
    odd = a[[slice(1, None, 2) for _ in range(a.ndim)]]
    

    【讨论】:

    • 感谢您的回答,但不幸的是,当我尝试运行它时,我收到了一些警告和错误,最基本的一个是 numpy 没有模块“切片”......尽管@Divakar 的回答已经满足了我的需求(至少对于第一个问题,我猜第二个问题没有令人满意的答案)你能解释一下你的答案背后的理由,这可能对我理解有用吗?谢谢!
    • 抱歉,切片对象是 Python 内置的。我更新了我的答案。我想它更具可读性。
    • 非常感谢,确实不错!我不知道有一个内置的“切片”代替了切片:符号,这确实很有用。澄清一下,问题的第二部分是让元素具有至少一个奇数索引,而不是所有赔率;在示例中,有 27 个元素,其中 8 个是偶数,我天真地希望找到一种方法来获得剩余的 19 个(这必然会变平,因为它们会失去任何形状)。但是再一次,我越想越觉得不合理,所以我对第一部分非常满意,谢谢!
    • 对我来说看起来非常高效(基于一些快速运行时测试)!不错。
    【解决方案2】:

    这是一种使用np.ix_的方法-

    a[np.ix_(*[range(0,i,2) for i in a.shape])]
    

    示例运行 -

    In [813]: def even_idx(a):
         ...:     return a[np.ix_(*[range(0,i,2) for i in a.shape])]
         ...: 
    
    In [814]: a = np.array(range(27)).reshape((3,3,3))
    
    In [815]: np.allclose(a[::2,::2,::2], even_idx(a) )
    Out[815]: True
    
    In [816]: a = np.array(range(27*4)).reshape((3,3,3,4))
    
    In [817]: np.allclose(a[::2,::2,::2,::2], even_idx(a) )
    Out[817]: True
    
    In [818]: a = np.array(range(27*4*5)).reshape((3,3,3,4,5))
    
    In [819]: np.allclose(a[::2,::2,::2,::2,::2], even_idx(a) )
    Out[819]: True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多