有没有一种快速的方法来在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])]
答案 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)