Skip to main content
 首页 » 编程设计

python之取方阵的方子矩阵

2025年05月04日15pengyingh

是否有更 Pythonic/更好的方法来做到这一点?

def square_take( m, idx ): 
    """ Take a square submatrix of m """ 
    return m.take( idx, axis=0 ).take( idx, axis=1 ) 
 
m = np.eye(3) 
idx = np.array( [0, 1] ) 
print square_take( m, idx ) 

它看起来很难看,我想知道我是否可以使用一个命令来完成它。

更新:

我已经将两种方案与原来的方法进行了对比:

def square_take( m, idx ): 
    """ Take a square submatrix of m """ 
    return m.take( idx, axis=0 ).take( idx, axis=1 ) 
 
def square_take2( m, idx ): 
    """ Take a square submatrix of m """ 
    return m[ np.ix_( idx, idx ) ] 
 
def square_take3( m, idx ): 
    """ Take a square submatrix of m """ 
    return m[idx][:,idx] 
 
N = 10000 
cv = np.random.randn( 30, 30 ) 
 
idx = np.array( [ 1, 2, 5, 6 ] ) 
with Timer( 'Square Take 1 ' ): 
    for _ in range( N ): 
        r1 = helpers.square_take( cv, idx ) 
 
with Timer( 'Square Take 2 ' ): 
    for _ in range( N ): 
        r2 = helpers.square_take2( cv, idx ) 
 
with Timer( 'Square Take 3 ' ): 
    for _ in range( N ): 
        r3 = helpers.square_take3( cv, idx ) 
 
np.testing.assert_array_equal( r1, r2 ) 
np.testing.assert_array_equal( r1, r3 ) 
  • Square Take 1 Tok 0.08s 秒

  • Square Take 2 耗时 0.30s 秒

  • Square Take 3 耗时 0.10s 秒

不幸的是,虽然这两个解决方案看起来更优雅,但它们比原来的要慢。

请您参考如下方法:

使用 numpy.ix_功能:

m[np.ix_(idx, idx)]