多准则有效地从numpy数组中选择元素

2024-04-20 13:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找一种最快的方法来选择满足几个条件的numpy数组的元素。例如,假设我要从一个数组中选择0.2到0.8之间的所有元素。我通常会这样做:

the_array = np.random.random(100000)
idx = (the_array > 0.2) * (the_array < 0.8)
selected_elements = the_array[idx]

但是,这会创建两个与_数组大小相同的额外数组(一个用于_数组gt;0.2,一个用于_数组<;0.8)。如果数组很大,这可能会消耗大量内存。有什么办法绕过这个问题吗?所有内置的numpy函数(比如logical峎and)似乎在幕后做同样的事情。在


Tags: the方法ltgtnumpy元素nprandom
1条回答
网友
1楼 · 发布于 2024-04-20 13:33:50

您可以为select实现一个定制的C调用。最基本的方法是通过ctypes实现。在

select.c

int select(float lower, float upper, float* in, float* out, int n)
{
  int ii;
  int outcount = 0;
  float val;
  for (ii=0;ii<n;ii++)
    {
      val = in[ii];
      if ((val>lower) && (val<upper))
        {
          out[outcount] = val;
          outcount++;
        }
    }
  return outcount;
}

编译为:

gcc -lm -shared select.c -o lib.so

在python方面:

选择.py

^{pr2}$

不要期望这样一个普通的实现会有很大的加速,但是在C端,您可以选择添加OpenMP杂注来获得快速而肮脏的并行性,这可能会给您带来显著的提升。在

同样,正如评论中提到的,numexpr可能是一种更快更简洁的方法,只需几行就可以完成所有这些。在

相关问题 更多 >