numpy.array从d维数组中选择所有偶数元素

时间:2017-01-24 21:52:26

标签: python arrays numpy indexing slice

是否有一种高效且pythonic的方式从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

提前感谢任何暗示!

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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