Python 基于2d numpy数组中的索引列表访问行的更有效方法?
所以我有2d numpay数组arr。它是一个相对较大的数组:Python 基于2d numpy数组中的索引列表访问行的更有效方法?,python,arrays,numpy,numpy-indexing,Python,Arrays,Numpy,Numpy Indexing,所以我有2d numpay数组arr。它是一个相对较大的数组:arr.shape=(240060000) 我目前正在做的是: 随机(替换)选择arr.shape[0]index 访问(按行)选择的arr索引 计算列平均值并选择最大值 我重复了k遍 它看起来像: 我的问题是速度很慢。对于我的arrsize,1个循环需要~3秒。因为我想要一个大于1k的样本——我目前的解决方案非常糟糕(1k*~3s->~1h)。我已经分析了它,瓶颈是基于索引访问行“平均值”和最大值”工作快速。np.random.
arr.shape=(240060000)
我目前正在做的是:
- 随机(替换)选择
indexarr.shape[0]
- 访问(按行)选择的
arr索引
- 计算列平均值并选择最大值
- 我重复了k遍
arr
size,1个循环需要~3秒。因为我想要一个大于1k的样本——我目前的解决方案非常糟糕(1k*~3s->~1h)。我已经分析了它,瓶颈是基于索引访问行<代码>“平均值”和最大值”
工作快速。np.random.choice
也可以
你认为有什么需要改进的地方吗?一种更有效的访问索引的方法,或者更好的更快的解决问题的方法
到目前为止,我尝试的是:
- numpy.take(较慢)
- numpy.ravel:
- 与当前方法类似,但没有环路。我创建了3d arr并一次性访问了其他维度的行
arr.mean(axis=0).max()不会改变,所以为什么不从该数组中随机抽取样本呢
比如:
mean_max = arr.mean(axis=0).max()
my_vals = np.array([np.random.choice(mean_max, size=len(mean_max), replace=True) for i in range(no_samples)])
你甚至可以这样做:my_vals=np.random.choice(mean_max,size=(no_samples,len(mean_max)),replace=True)
,但我不确定这将如何改变你的统计数据。因为它将生成一个副本,程序将在arr[random_idxs]
中分配巨大的内存
因此,提高效率最简单的方法之一就是成批处理
BATCH = 512
max(arr[random_idxs,i:i+BATCH].mean(axis=0).max() for i in range(0,arr.shape[1],BATCH))
什么是代码中的no_samples
?no_samples只是定义样本大小的整数。我想知道我是否遵循了arr.mean(axis=0).max()
将改变-这就是整点。我选择随机指数替换。所以每一次迭代,每一列的方法应该是不同的。然后我从这些列中选择最高值,并将其作为最终列表的数据点追加。至于你的解决方案,它不会运行mean_max
您建议的是一个浮点数。这只是arr的最高平均值(平均值按列计算)。因此,您尝试从可用的单个值中随机选择单个值。谢谢-这确实有帮助!我已通过批处理方法将其速度提高了约3.5倍。单次迭代从~3s减少到~0.79。我只想补充一点,使用合适的批量是很好的。我做了几次测试。以下是在100次迭代中的结果(批处理,平均时间):(16,1.13),(32,0.87),(64,0.79),(128,1.2),(256,1.33),(512,1.8)和(1024,2.47)
mean_max = arr.mean(axis=0).max()
my_vals = np.array([np.random.choice(mean_max, size=len(mean_max), replace=True) for i in range(no_samples)])
BATCH = 512
max(arr[random_idxs,i:i+BATCH].mean(axis=0).max() for i in range(0,arr.shape[1],BATCH))