1
我有我生成使用翻译
A1, M1, A2, M2, A3, M3, E = meshgrid(Grid.aGrid, Grid.mGrid, Grid.aGrid, Grid.mGrid, Grid.aGrid, Grid.mGrid, Grid.eGrid, indexing='ij')
,其中Grid.aGrid
使用linspace(aMin, aMax, nA)
产生形状(A1, M1, A2, M2, A3, M3, E)
的网格,并且类似地对于其它的网格。
考虑一些Z = f(A1, ...)
,其中f()
将标记一些网格点为无关紧要。为简单起见,假设它是
Z = A1 + A2 + A3
Z[Z < 0] = NaN
考虑Z[0, 1, 2, 3, 4, 5, 6]
。它包含对应于实际值(aGrid[0], mGrid[1], aGrid[2], mGrid[3], aGrid[4], mGrid[5], eGrid[6])
的值。这正是我尝试实现未标记的f()
上Z
所有点:
我想创建一个字典
foo = {z1, z2, z3, ... zn}
其中z1
等都是那种
z1 = (aGrid[0], mGrid[1], aGrid[2], mGrid[3], aGrid[4], mGrid[5], eGrid[6])
,这是Z
内部对应z1
位置的网格值。
我想出了:
aGrid = arange(0, 10)
mGrid = arange(100, 110)
eGrid = arange(1000, 1200)
A,M,E = meshgrid(aGrid, mGrid, eGrid, indexing='ij')
# contains the grid index
Z = (A + M + E).astype(float)
Z[A < 3] = nan
# will contain the actual values, as tuples
Z2 = {}
for i, idx in enumerate(ndindex(Z.shape)):
a = aGrid[idx[0]]
m = mGrid[idx[1]]
e = eGrid[idx[2]]
if isnan(Z[idx]):
Z2[i] = NaN
else:
Z2[i] = (a, m, e)
效率是关键。有没有更快更清洁的方式可以实现这一目标?任何使用字典的替代方法?
我特别不喜欢我必须写下aGrid[idx[0]]
等。是否有可能让算法更一般?沿的
for i, idx in enumerate(ndindex(Z.shape)):
# some magic happens here. What exactly?
someMagicList = magic(aGrid, mGrid, eGrid)
Z2[i] = someMagicList[idx]
这看起来比我所做的更有效率的提高。正如我正在试图将其写入我的脚本中;如果可能的话,我会做一个简短的后续行动(我认为这对于一个新问题来说太短了):我如何(有效地)获取那些不是“NaN”的子集? 'stateRelevant = [z for z in states如果不是np.isnan(z.any())]'把它们全部放进去了。显然,'isnan()'没有用来选择那些具有'(nan,.. )在他们身上。 – FooBar
我不明白你的问题,'州'是什么?你是指'Z [〜np.isnan(Z)]'还是'Z2 [〜np.isnan(Z)]'? – HYRY
对不起,我的意思是'Z2'。使用'Z'作为'isnan()'的指示器很好,但如果我只剩下'Z2',该怎么办?我打算只通过处理它的函数传递'Z2'。 – FooBar