Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于2d numpy数组中的索引列表访问行的更有效方法?_Python_Arrays_Numpy_Numpy Indexing - Fatal编程技术网

Python 基于2d numpy数组中的索引列表访问行的更有效方法?

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.

所以我有2d numpay数组arr。它是一个相对较大的数组:
arr.shape=(240060000)

我目前正在做的是:

  • 随机(替换)选择
    arr.shape[0]
    index
  • 访问(按行)选择的
    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))