有没有更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 )
Run Code Online (Sandbox Code Playgroud)
它看起来很难看,我想知道是否可以使用单个命令来完成它。
更新:
我将这两种解决方案与原来的方法进行了比较:
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 )
Run Code Online (Sandbox Code Playgroud)
Square Take 1 花费了 0.08s 秒
Square Take 2 花了 0.30s 秒
Square Take 3 花了 0.10s 秒
不幸的是,虽然这两个解决方案看起来更优雅,但它们比原始解决方案慢。