我有一个使用
生成的形状网格(A1, M1, A2, M2, A3, M3, E)
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)
,其他网格也是如此。
考虑一些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])
对应的值。这正是我尝试在Z
上未标记为f()
的所有点上实现的目标:
我想创建一个词典
foo = {z1, z2, z3, ... zn}
其中z1
等都是
z1 = (aGrid[0], mGrid[1], aGrid[2], mGrid[3], aGrid[4], mGrid[5], eGrid[6])
,这是与z1
内Z
的位置对应的网格值。
我想出了一些东西:
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]
答案 0 :(得分:1)
使用broadcast_arrays()
,结果Z2
是一个形状为(20000, 3)
的数组。
import numpy as np
aGrid = np.arange(0, 10, dtype=float)
mGrid = np.arange(100, 110, dtype=float)
eGrid = np.arange(1000, 1200, dtype=float)
A,M,E = np.meshgrid(aGrid, mGrid, eGrid, indexing='ij')
# contains the grid index
Z = (A + M + E).astype(float)
Z[A < 3] = np.nan
grids = [A, M, E]
grid_bc = np.broadcast_arrays(*grids)
Z2 = np.column_stack([g.ravel() for g in grid_bc])
Z2[np.isnan(Z.ravel())] = np.nan
print Z2[5900], Z2[6000]