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 维数组中选择所有偶数元素的主要内容,如果未能解决你的问题,请参考以下文章