numpy获取行和列索引的所有组合2D数组

2024-04-16 23:55:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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.非零公司名称:

^{pr2}$

现在是否有一些优雅的numpy切片方法来获得rfilter中r和cfilter中c的foo[r,c]的所有组合?i、 e.我想得到以下输出:

array([[ 6,  7,  8,  9, 10],
       [12, 14, 16, 18, 20]])

注意:我知道从数组中获取块很容易进行基本的切片选择,但是在更高级的用例中,cfilter和rfilter中的索引不一定是相邻的。在

非常感谢!在


Tags: inimportnumpyforfooasnp公司
3条回答

你不需要非零。像(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)]

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

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

In [167]: foo[rsum<165][:,csum>80]
Out[167]: 
array([[ 6,  7,  8,  9, 10],
       [12, 14, 16, 18, 20]])

它是可读的,而且相当快:

^{pr2}$

PS:创建foo的更快方法是

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

要索引叉积,请使用np.ix_

foo[np.ix_(*(rfilter + cfilter))]

可以直接使用布尔索引(即不使用np.nonzero):

^{pr2}$

请注意,np.ix_所做的只是适当地添加轴,以提供可以一起广播的索引数组:

>>> np.ix_(*(rfilter + cfilter))
(array([[0],
       [1]]), array([[5, 6, 7, 8, 9]]))

相关问题 更多 >