1

我有一个联合概率质量函数数组,其形状例如 (1,2,3,4,5,6),我想计算概率表,以某些维度的值为条件(导出 cpts) , 用于决策目的。

我现在想出的代码如下(输入是 {'variable_1': value_1, 'variable_2': value_2 ... } 形式的字典“vdict”)

for i in vdict:
   dim = self.invardict.index(i) # The index of the dimension that our Variable resides in
   val = self.valdict[i][vdict[i]] # The value we want it to be
   d = d.swapaxes(0, dim)
   **d = array([d[val]])**
   d = d.swapaxes(0, dim)

...

所以,我目前做的是:

  1. 我将变量转换为 cpt 中的相应维度。
  2. 我将第零轴与之前找到的轴交换。
  3. 我只用所需的值替换整个 0 轴。

我把维度放回原来的轴。

现在,问题是,为了执行第 2 步,我必须 (a.) 计算一个子数组,并且 (b.) 将其放入一个列表并再次将其转换为数组,这样我就有了我的新数组。

事情是,粗体的东西意味着我创建新对象,而不是只使用对旧对象的引用,如果 d 非常大(这发生在我身上)并且使用 d 的方法被调用多次(再次,发生在我身上)整个结果非常缓慢。

那么,有没有人想出一个想法,可以让这小段代码变得更简单,并且运行得更快?也许可以让我计算适当的条件。

注意:我必须保持原始轴顺序(或者至少要确定在删除轴时如何将变量更新为尺寸字典)。我不想诉诸自定义 dtypes。

4

1 回答 1

1

好的,在玩了一点 numpy 的就地数组操作后,我自己找到了答案。

将循环中的最后 3 行更改为:

    d = conditionalize(d, dim, val)

其中条件化定义为:

    def conditionalize(arr, dim, val):
        arr = arr.swapaxes(dim, 0)
        shape = arr.shape[1:]       # shape of the sub-array when we omit the desired dimension.
        count = array(shape).prod() # count of elements omitted the desired dimension.
        arr = arr.reshape(array(arr.shape).prod()) # flatten the array in-place.
        arr = arr[val*count:(val+1)*count] # take the needed elements
        arr = arr.reshape((1,)+shape) # the desired sub-array shape.
        arr = arr. swapaxes(0, dim)   # fix dimensions

        return arr

这使我的程序的执行时间从 15 分钟减少到 6 秒。巨大的收获。

我希望这可以帮助遇到同样问题的人。

于 2010-02-07T20:23:28.037 回答