Python 调用具有不同参数的函数以有效修改numpy数组
我想从这段代码中消除非有效的for循环Python 调用具有不同参数的函数以有效修改numpy数组,python,arrays,performance,numpy,Python,Arrays,Performance,Numpy,我想从这段代码中消除非有效的for循环 import numpy as np x = np.zeros((5,5)) for i in range(5): x[i] = np.random.choice(i+1, 5) 在保持给定输出的同时 [[0. 0. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 2. 2. 1. 0.] [1. 2. 3. 1. 0.] [1. 0. 3. 3. 1.]] 我试过这个 i = np.arange(5) x[i] =
import numpy as np
x = np.zeros((5,5))
for i in range(5):
x[i] = np.random.choice(i+1, 5)
在保持给定输出的同时
[[0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 2. 2. 1. 0.]
[1. 2. 3. 1. 0.]
[1. 0. 3. 3. 1.]]
我试过这个
i = np.arange(5)
x[i] = np.random.choice(i+1, 5)
但它输出
[[0. 1. 1. 3. 3.]
[0. 1. 1. 3. 3.]
[0. 1. 1. 3. 3.]
[0. 1. 1. 3. 3.]
[0. 1. 1. 3. 3.]]
是否可以移除回路?如果不是,对于大数组和大量重复,哪种方法最有效?创建一个随机整数数组,每行的最大数值为列数。因此,我们可以使用
np.random.randint
,将其high
arg设置为cols的数量。然后,执行模数运算,在每行上设置由行号定义的不同限制。因此,我们将有一个这样的矢量化实现-
def create_rand_limited_per_row(m,n):
s = np.arange(1,m+1)
return np.random.randint(low=0,high=n,size=(m,n))%s[:,None]
样本运行-
In [45]: create_rand_limited_per_row(m=5,n=5)
Out[45]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 2, 0, 2, 1],
[0, 0, 1, 3, 0],
[1, 2, 3, 3, 2]])
利用大型数据-
import numexpr as ne
def create_rand_limited_per_row_numepxr(m,n):
s = np.arange(1,m+1)[:,None]
a = np.random.randint(0,n,(m,n))
return ne.evaluate('a%s')
标杆管理
1k x 1k
数据上的计时-
In [71]: %timeit create_rand_limited_per_row_loopy(m=1000,n=1000)
10 loops, best of 3: 20.6 ms per loop
In [72]: %timeit create_rand_limited_per_row(m=1000,n=1000)
100 loops, best of 3: 14.3 ms per loop
In [73]: %timeit create_rand_limited_per_row_numepxr(m=1000,n=1000)
100 loops, best of 3: 6.98 ms per loop
In [71]: %timeit create_rand_limited_per_row_loopy(m=1000,n=1000)
10 loops, best of 3: 20.6 ms per loop
In [72]: %timeit create_rand_limited_per_row(m=1000,n=1000)
100 loops, best of 3: 14.3 ms per loop
In [73]: %timeit create_rand_limited_per_row_numepxr(m=1000,n=1000)
100 loops, best of 3: 6.98 ms per loop