np.where
在异地、无缓存的情况下看起来相当快:
np.where(ut,ut,ut.T)
在我的笔记本电脑上:
timeit(lambda:np.where(ut,ut,ut.T))
# 1.909718865994364
如果您安装了 pythran,您可以几乎零努力地将速度提高 3 倍。但请注意,据我所知 pythran (当前)仅理解连续数组。
file <upp2sym.py>
,编译为pythran -O3 upp2sym.py
import numpy as np
#pythran export upp2sym(float[:,:])
def upp2sym(a):
return np.where(a,a,a.T)
Timing:
from upp2sym import *
timeit(lambda:upp2sym(ut))
# 0.5760842661838979
这几乎和循环一样快:
#pythran export upp2sym_loop(float[:,:])
def upp2sym_loop(a):
out = np.empty_like(a)
for i in range(len(a)):
out[i,i] = a[i,i]
for j in range(i):
out[i,j] = out[j,i] = a[j,i]
return out
Timing:
timeit(lambda:upp2sym_loop(ut))
# 0.4794591029640287
我们也可以就地进行:
#pythran export upp2sym_inplace(float[:,:])
def upp2sym_inplace(a):
for i in range(len(a)):
for j in range(i):
a[i,j] = a[j,i]
Timing
timeit(lambda:upp2sym_inplace(ut))
# 0.28711927914991975