python - 调用具有不同参数的函数以有效地修改 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] = 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.]]
是否可以删除循环?如果不是,对于大数组和大量重复,哪种方法最有效?
解决方案
创建一个随机 int 数组,其中每行的最大数作为列数。因此,我们可以将np.random.randint
其high
arg 设置为 no。科尔斯。然后,执行模运算以在每一行中设置由行号定义的不同限制。因此,我们将有一个像这样的矢量化实现 -
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]])
利用模块multi-core
处理numexpr
大数据 -
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')
基准测试
# Original approach
def create_rand_limited_per_row_loopy(m,n):
x = np.empty((m,n),dtype=int)
for i in range(m):
x[i] = np.random.choice(i+1, n)
return x
数据计时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
推荐阅读
- unit-testing - 如何在启用 --std=c++11 标志的命令行中运行 google Test
- c++-cli - C++ CLI 在打开窗口时画一条线
- r - 在 mutate() 中使用 case_when() 为因子变量创建级别
- python - 如何计算分组df的差异?
- javascript - 有没有办法在按钮或链接中调用引导程序功能?
- r - 错误:美学必须是长度1或与数据相同(4):y,填充
- spring-statemachine - Spring StateMachine 可以有多少个 StateMachine?
- python - 创建迭代器以从每个可迭代对象中一一返回元素
- python - 当我尝试使用 corsheaders 时,为什么我的应用程序会中断?
- sql - SQL:查询以按月获取结果