有没有一种快速的方法来创建具有1和x * 0的向量?

时间:2019-11-24 00:31:32

标签: python python-3.x numpy

有没有一种快速的方法来在python中创建具有1和x * 0的向量?

我想要类似

a = [1,0,0,0,0,0,0,0,0,...,0]
b = [1,1,0,0,0,0,0,0,0,...,0]

我尝试了list,但看到了自己:(

list = [1, n*[0]]
list = np.array(list)
print(list)
==> [1 list([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])]

3 个答案:

答案 0 :(得分:7)

适当的NumPy解决方案:

import numpy as np

n = 10
arr = np.zeros(shape=n + 1, dtype=np.int64)
arr[0] = 1

结果:[1 0 0 0 0 0 0 0 0 0 0]


快速基准测试

这是我们要比较的功能:

def func_1(n):
    return np.array([1, *n*[0]])

def func_2(n):
    arr = np.zeros(shape=n + 1, dtype=np.int64)
    arr[0] = 1
    return arr

def func_3(n):
    return np.array([1] + n * [0])

def func_4(n):
    return np.array([1] + [0 for _ in range(n)])

def func_5(n):
    return np.array([1].extend((0 for _ in range(n))))

def func_6(n):
    return np.array([1].extend([0 for _ in range(n)]))

def func_7(n):
    arr = [0 for _ in range(n)]
    arr[0] = 1
    return np.array(arr)

{{1}中timeit的结果:

  • arr_size = 100000000

      

    1个循环,每循环3:7.3最佳

  • %timeit func_1(arr_size)

      

    10个循环,每个循环最好3:177毫秒

  • %timeit func_2(arr_size)

      

    1个循环,每个循环最好3:7.26 s

  • %timeit func_3(arr_size)

      

    1个循环,每个循环最好3:11.4 s

  • %timeit func_4(arr_size)

      

    1个循环,最好是3:每个循环6.3 s

  • %timeit func_5(arr_size)

      

    1个循环,每个循环最好3:4.95 s

  • %timeit func_6(arr_size)

      

    1个循环,每个循环最好3:10.6 s

答案 1 :(得分:2)

只需在代码中添加一个星号即可使用unpacking[1, *n*[0]]而不是[1, n*[0]]

>>> arr = np.array([1, *n*[0]])

array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

答案 2 :(得分:0)

还有另一种NumPy解决方案,其性能仅比@AMC发布的解决方案稍差,但具有方便性,因为它是单个表达式,不需要包装在函数中即可内联使用:

>>> n = 10
>>> np.eye(1, n + 1, 0, dtype=int)[0]
array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

通过更改第三个参数来创建其他相同长度的单热点向量也很容易:

>> np.eye(1, n + 1, 4, dtype=int)[0]
array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0])

以下是与@AMC的func_2(相同arr_size = 100000000)进行比较的结果:

def func_8(n, k=0):
    return np.eye(1, n + 1, k, dtype=int)[0]
>>> %timeit func_2(arr_size)
16.4 µs ± 111 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
>>> %timeit func_8(arr_size)
19 µs ± 113 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)