Python:numpy ndarray列花式索引切片是否存在隐藏的时间复杂度?

时间:2016-04-15 22:28:24

标签: python performance numpy indexing complexity-theory

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最佳功能后,我在现实世界中遇到了这个问题,所以我们非常感谢您的帮助!

0 个答案:

没有答案