我有一个大的numpy数组k
,形状未明,我想构造一个形状相同的数组d
,当k
中对应的条目在两个常量lo
和hi
之间时,它是1.0,否则为0.0。(由于较大的代码正在执行的操作,我不希望使用布尔值数组。)
最明显的方法是
d = np.ones_like(k)
d[np.less(k, lo)] = 0
d[np.greater(k, hi)] = 0
然而,np.less
和np.greater
调用涉及到创建大型scratch布尔数组,我已经测量到这是一个很大的开销。有没有一种方法可以在保持完全矢量化的情况下执行此操作,而不需要创建任何大的scratch对象?你知道吗
您可以基于比较创建布尔数组,然后一次性转换为浮点类型,如下所示-
正如其他人所说,numpy对临时缓冲区的负担很重,它不能提供太多的控制。如果内存占用真的是一个拦路虎,你可以放弃你自己的小程序。例如
其中
_process
用cython表示:这里我使用了jupyter笔记本(因此使用了有趣的
%%cython
语法)。在实际的项目中,您需要加入一个setup.py
来编译扩展等,这样做的好处是否值得麻烦取决于您自己。你知道吗less
和greater
取out
参数:最终可能会保存一个中间数组。虽然我对ufunc
out
的印象是它仍然创建了一个临时数组,但只是将它复制到out
。你知道吗在一个小的(10x10)数组上,这比@zwol的方法快,但比@Divakar的方法慢,但差别不大。你知道吗
相关问题 更多 >
编程相关推荐