Python numpy获取二维数组中所有行和列索引的组合

Python numpy获取二维数组中所有行和列索引的组合,python,numpy,Python,Numpy,我有一个2D numpy数组,如下所示: import numpy as np foo = np.array([[(i+1)*(j+1) for i in range(10)] for j in range(5)]) #array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], # [ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20], # [ 3, 6, 9, 12, 15,

我有一个2D numpy数组,如下所示:

import numpy as np
foo = np.array([[(i+1)*(j+1) for i in range(10)] for j in range(5)])

    #array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
    #       [ 2,  4,  6,  8, 10, 12, 14, 16, 18, 20],
    #       [ 3,  6,  9, 12, 15, 18, 21, 24, 27, 30],
    #       [ 4,  8, 12, 16, 20, 24, 28, 32, 36, 40],
    #       [ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50]])
我使用np.nonzero创建了一些筛选条件:

csum = np.sum(foo,axis=0)
#array([ 15,  30,  45,  60,  75,  90, 105, 120, 135, 150])
rsum = np.sum(foo,axis=1)
#array([ 55, 110, 165, 220, 275])
cfilter = np.nonzero(csum > 80)
#(array([5, 6, 7, 8, 9]),)
rfilter = np.nonzero(rsum < 165)
#(array([0, 1]),)
注意:我知道从数组中选择一个块很容易,但是在更高级的用例中,cfilter和rfilter中的索引不一定紧挨着彼此


非常感谢

要对叉积进行索引,请使用
np.ix

foo[np.ix_(*(rfilter + cfilter))]
您可以直接使用布尔索引(即不使用
np.nonzero
):


对于这个,实际上不需要非零。类似(csum>80)的表达式将生成一个新的矩阵。您想要的是(csum>80)&&(rsum<165),但是&&不是在矩阵上定义的。然而,*是,它在布尔矩阵上也是如此。唯一的问题是csum和rsum阵列的形状不正确。但是,如果你把它们正确地堆叠起来,它们就可以被广播

csum = np.hstack (sum (foo, axis=0))
rsum = np.vstack (sum (foo, axis=1))
print foo[(csum > 80) * (hsum < 165)]
csum=np.hstack(总和(foo,轴=0))
rsum=np.vstack(和(foo,轴=1))
印刷字体[(csum>80)*(hsum<165)]

唯一的缺点是,这会在一维数组中生成所需单元格的值。您需要对其进行重塑()以获得所需的格式。

另一种方法是使用索引两次:

In [167]: foo[rsum<165][:,csum>80]
Out[167]: 
array([[ 6,  7,  8,  9, 10],
       [12, 14, 16, 18, 20]])
>>> np.ix_(*(rfilter + cfilter))
(array([[0],
       [1]]), array([[5, 6, 7, 8, 9]]))
csum = np.hstack (sum (foo, axis=0))
rsum = np.vstack (sum (foo, axis=1))
print foo[(csum > 80) * (hsum < 165)]
In [167]: foo[rsum<165][:,csum>80]
Out[167]: 
array([[ 6,  7,  8,  9, 10],
       [12, 14, 16, 18, 20]])
In [168]: %timeit foo[rsum<165][:,csum>80]
100000 loops, best of 3: 9.66 us per loop

In [170]: %timeit foo[np.ix_(rsum<165, csum>80)]
100000 loops, best of 3: 16.4 us per loop
In [31]: np.multiply.outer(range(1,6),range(1,11))
Out[31]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [ 2,  4,  6,  8, 10, 12, 14, 16, 18, 20],
       [ 3,  6,  9, 12, 15, 18, 21, 24, 27, 30],
       [ 4,  8, 12, 16, 20, 24, 28, 32, 36, 40],
       [ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50]])

In [32]: %timeit np.multiply.outer(range(1,6),range(1,11))
100000 loops, best of 3: 14.2 us per loop

In [33]: %timeit np.array([[(i+1)*(j+1) for i in range(10)] for j in range(5)])
10000 loops, best of 3: 26.6 us per loop