根据条件有效地反转列表中的浮点数

时间:2018-03-14 23:57:27

标签: python arrays performance numpy

我有一个浮点数(a)和一个0或1(b列表)的ndarray。 ab具有相同的长度,通常为1000.我想将一个简单函数(例如减去反函数)应用于a的元素,其索引对应于{1 {1}}。

以下方法需要少于1毫秒。是否可以加快速度?

b

1 个答案:

答案 0 :(得分:4)

使用a作为掩码,并相应地设置m = np.array(b).astype(bool) a[m] = -1 / a[m] 个单元格:

b

更好的是,使用np.random.choice初始化b = np.random.choice(2, 1000).astype(bool)

b

现在,您不需要将a转换为数组的开销,只需直接使用它来索引a[b] = -1 / a[b]

22.3 µs ± 501 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

这在

中运行
def mask(string, start=0, end=0, chunk=4, char="*"):

    if isinstance(string, str):

        string_len = len(string)

        if string_len < 3:
            return "input len = {}, what's the point?".format(string_len)

        if start <= 0 or end <= 0:
            start = string_len // chunk
            end = start

        if string_len <= 4:
            mask_len = string_len // 2
            start = 1 if mask_len - 1 == 0 else mask_len - 1
            end = start
        else:
            mask_len = string_len - abs(start) - abs(end)

        return string[:abs(start)] + (char * mask_len) + string[-end:]



if __name__ == "__main__":

    s = "abcdefghijklmnopqrstuvwxyz01234567890a0b0c0d0e0f1a1b1c1d1e1f2a2b"
    l = [i for i in s]
    message = "ip: {}\nop: {}\n"
    section = "-"*79

    print("\nSTRINGS")
    print(section)
    print(message.format(s[:4], mask(s[:4])))
    print(message.format(s[:3], mask(s[:3])))
    print(message.format(s[:2], mask(s[:2])))
    print(message.format(s, mask(s)))
    print(message.format(s, mask(s,start=2,end=4,char="#")))
    print(message.format(s, mask(s,start=3,end=3,char="x")))