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

Posted

技术标签:

【中文标题】numpy.array 从 d 维数组中选择所有偶数元素【英文标题】:numpy.array select all even elements from d-dimensional array 【发布时间】: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

提前感谢您的任何提示!

【问题讨论】:

【参考方案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

【讨论】:

以上是关于numpy.array 从 d 维数组中选择所有偶数元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NumPy 数组中删除所有零元素?

Numpy库:NumPy的数组类ndarray

Python数据分析-Numpy

Python中的Numpy包

数据科学包——numpy

数据科学包——numpy