我有一个连续概率质量函数数组,有形状,例如(1,2,3,4,5,6),我想计算概率表,条件是某些维度的值(导出) cpts),用于决策目的。
我现在提出的代码如下(输入是{'variable_1'形式的词典“vdict”:value_1,'variable_2':value_2 ...})
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)
...
所以,我现在所做的是:
我将尺寸放回原轴。
现在,问题是,为了做第2步,我有(a。)来计算一个子阵列 和(b。)把它放在一个列表中并再次翻译成数组,这样我就可以得到我的新数组。
事情是,粗体的东西意味着我创建新对象,而不是仅使用对旧对象的引用,如果d非常大(这发生在我身上),并且使用d的方法被多次调用(这再次发生在我身上)整个结果非常缓慢。
那么,有没有人想出一个能够使这一小段代码更轻松并且运行速度更快的想法?也许某些东西可以让我计算出适当的条件。
注意:我必须保持原始轴顺序(或者至少确保在移除轴时如何将变量更新为尺寸字典)。我不想使用自定义dtypes。
答案 0 :(得分:1)
好的,在使用numpy的就地数组操作后,我自己找到了答案。
将循环中的最后3行更改为:
d = conditionalize(d, dim, val)
其中conditionalize定义为:
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秒。巨大的收获。
我希望这可以帮助遇到同样问题的人。