python - numba 和 numpy.expand_dims
问题描述
我正在重写我的一些函数以适合 Numba。现在我有一个函数,我在脚本中多次调用不同维度的输入数组。
def FormHistMatrix2(x,Whc,Lm):
if x.ndim == 1:
x = np.expand_dims(x,axis=1)
[N,Ncells] = x.shape
这是我函数的开始,Numba 抛出以下错误:
TypingError: Cannot unify array(float64, 2d, A) and array(float64, 3d, A) for 'x', defined at C:/Users/DNP_Student_3/Documents/Python Scripts/GCFuncsTests.py (332)
在这种情况下,“x”是一个二维数组,但在其他情况下,它可以是一个一维数组。那么 Numba 不喜欢 if 循环吗?或者这里发生了什么?
解决方案
JoshAdel 所说的通常是正确的,但在这种情况下,问题是您需要根据输入类型对函数进行不同的实现/专业化。
Numba 有这个案例的@generated_jit
-decorator。
在您的情况下,您需要编写一个专门的 expand-dims 函数,该函数取决于输入数组的维度:
import numba as nb
@nb.generated_jit(nopython=True)
def nb_expander(x):
if x.ndim == 1:
return lambda x: np.expand_dims(x, axis=1)
else:
return lambda x: x
此函数需要从您的其他函数中调用:
@nb.njit
def FormHistMatrix2(x, Whc, Lm):
x = nb_expander(x)
[N, Ncells] = x.shape
这现在适用于x
维度 1 和 2。因为x.ndim==3
您还需要为形状实现类似的方法。
推荐阅读
- xamarin - 如何将 iOS 目标项目添加到只有 Android 配置的 Xamarin 表单 Prism 项目?
- youtube - 如何获取有关许可视频的信息?| 获取视频信息
- docker - 无法将容器中 Kafka 生产者的消息镜像到消费者
- c# - 温莎城堡 5 LifestylePerWebRequest 丢失
- javascript - 使用 react-select 及其 menuIsOpen 属性的问题
- javascript - 如何在头部的脚本标签中传递参数
- php - 使用 Uppy 将文件从 ReactJs 上传到 PHP 服务器(Yii2)
- hash - 无法用循环解开一些刚刚用 python 3 腌制的数据
- c++ - `std::chrono` 时钟与`boost::xtime` 的比较
- python - Python for循环:执行第二行覆盖在第一行创建的对象