减少所有维度的操作,但只有一个

时间:2017-04-05 14:52:17

标签: python arrays numpy

我有一个具有多个维度的布尔numpy数组,例如,

import numpy

a = numpy.random.rand(7, 7, 3) < 0.1

我现在想在所有维度上执行all操作,但最后一个检索大小为3的数组。这个

all_small = [numpy.all(a[..., k]) for k in range(a.shape[-1])]

有效,但是因为如果a在最后一个维度很长,Python循环非常慢。

有关如何对此进行矢量化的任何提示?

1 个答案:

答案 0 :(得分:3)

我们可以使用3D param。因此,对于要跳过最后一个的a.all(axis=(0,1)) 数组,它将是 -

numpy.all

要处理通用维数的ndarray并沿指定的所有轴执行def numpy_all_except_one(a, axis=-1): axes = np.arange(a.ndim) axes = np.delete(axes, axis) return np.all(a, axis=tuple(axes)) 操作,实现看起来像这样 -

In [90]: a = numpy.random.rand(7, 7, 3) < 0.99

In [91]: a.all(axis=(0,1))
Out[91]: array([False, False,  True], dtype=bool)

In [92]: numpy_all_except_one(a) # By default skips last axis
Out[92]: array([False, False,  True], dtype=bool)

In [93]: a.all(axis=(0,2))
Out[93]: array([ True, False,  True,  True,  True,  True,  True], dtype=bool)

In [94]: numpy_all_except_one(a, axis=1)
Out[94]: array([ True, False,  True,  True,  True,  True,  True], dtype=bool)

In [95]: a.all(axis=(1,2))
Out[95]: array([False,  True,  True, False,  True,  True,  True], dtype=bool)

In [96]: numpy_all_except_one(a, axis=0)
Out[96]: array([False,  True,  True, False,  True,  True,  True], dtype=bool)

样本运行以测试所有轴 -

{{1}}