numpy ndarray
列花式索引切片是否存在某种隐藏时间成本?即:从现有的numpy ndarray
矩阵中选择一组列。
考虑以下示例:
import numpy as np
N = (3000000,500)
M = np.zeros(N, dtype=int)
mask = []
for i in range(N[1]):
mask.append(np.random.choice([True, False, False]))
num_mask = [i for i, x in enumerate(mask) if x == True]
# 2 function calls in 0.000 seconds
%prun M[:10,num_mask]
# 2 function calls in 0.003 seconds
%prun M[:100,num_mask]
# 2 function calls in 0.014 seconds
%prun M[:1000,num_mask]
# 2 function calls in 0.099 seconds
%prun M[:10000,num_mask]
# 2 function calls in 1.520 seconds
%prun M[:100000, num_mask]
# ....? Meanwhile I am posting here (> 15 seconds)
%prun M[:1000000, num_mask]
我还在等最后一次跑!
在理想情况下,我可以按如下方式屏蔽所有行:
M[:, num_mask]
有没有更有效的方法来解决这个问题?
一个有趣的发展是分裂 - 应用 - 组合如下:
# 19 function calls in 12.978 seconds
def sub_mask(M, num_mask):
M_ = np.split(M[:1000000], len(M[:100000])/100000)
sol_ = []
for M in M_:
sol_.append(M[:,num_mask])
return np.concatenate(sol_)
%prun sol = sub_mask(M, num_mask)
鉴于连接操作,虽然这样做效率更高,但却很困惑。
我很困惑。预计线性时间增加约为15秒。在为回归问题选择k
最佳功能后,我在现实世界中遇到了这个问题,所以我们非常感谢您的帮助!