Python 将值设置为单元格变量

Python 将值设置为单元格变量,python,fipy,Python,Fipy,我有以下功能: def setupSinkGrid_(self, sinkCoords,mesh,x,y,z,patchSize=1) : sinkGrid = CellVariable(name="source", mesh=mesh, value=0) sinkGrid.setValue(0.) for pos,v in sinkCoords.iteritems(): sinkGrid.setValue(v, wh

我有以下功能:

def setupSinkGrid_(self, sinkCoords,mesh,x,y,z,patchSize=1)   :
        sinkGrid = CellVariable(name="source", mesh=mesh, value=0)
        sinkGrid.setValue(0.)

        for pos,v in sinkCoords.iteritems():
            sinkGrid.setValue(v, where=(z > pos[0]-patchSize) & (z < pos[0]+patchSize) & (y > pos[1]-patchSize) & (y < pos[1]+patchSize) & (x > pos[2]-patchSize) & (x < pos[2]+patchSize))

        return sinkGrid
sinkCoords是一个坐标值字典。例如:
{(1,2,3)=>4}
指示1,2,3处的值为4

其想法是将每个这样的坐标映射到网格上

问题是在调试时,我发现每个接收器值都映射到多个位置“接近”实际目标。在循环的第一次迭代(
pos=:(16,16,2)
)之后,我得到:

[np.unravel_index(i,(20,20,20)) for i,x in enumerate(list(sinkGrid)) if x > 0]
它返回一个25的值,设置为8个不同的索引

0 = {tuple} <type 'tuple'>: (15, 15, 1)
1 = {tuple} <type 'tuple'>: (15, 15, 2)
2 = {tuple} <type 'tuple'>: (15, 16, 1)
3 = {tuple} <type 'tuple'>: (15, 16, 2)
4 = {tuple} <type 'tuple'>: (16, 15, 1)
5 = {tuple} <type 'tuple'>: (16, 15, 2)
6 = {tuple} <type 'tuple'>: (16, 16, 1)
7 = {tuple} <type 'tuple'>: (16, 16, 2)
0={tuple}:(15,15,1)
1={tuple}:(15,15,2)
2={tuple}:(15,16,1)
3={tuple}:(15,16,2)
4={tuple}:(16,15,1)
5={tuple}:(16,15,2)
6={tuple}:(16,16,1)
7={tuple}:(16,16,2)
我的观察结果是,这些坐标总是“较低”,但:

1) 为什么只针对一些邻居?那为什么我不能得到整个摩尔街区呢

2) 为什么只关注至少在一个维度上较低的邻居


3) 这是什么原因造成的?这只是一些错误。如果是这样,我应该使用
patchSize-k
或类似的东西吗?

问题是
x
y
,和
z
是单元格中心的坐标,它们位于((0.5,0.5,0.5),(1.5,0.5,0.5),…)

(16,16,2)+/-1
将包括以下位置的单元格:

(15.5, 15.5, 1.5)
(15.5, 15.5, 2.5)
(15.5, 16.5, 1.5)
(15.5, 16.5, 2.5)
(16.5, 15.5, 1.5)
(16.5, 15.5, 2.5)
(16.5, 16.5, 1.5)
(16.5, 16.5, 2.5)
你有两个选择:

  • 提供与单元中心相对应的
    sinkCoords
    ,例如
    (15.5、15.5、1.5
  • patchSize
    限制为单元格尺寸的一半
  • 无论如何,第2项可能是个好主意


    您需要确保您正在记账或整个范围,例如,
    (z>pos[0]-patchSize)&(z)在
    setupSinkGrid\uuu
    的参数列表中有两个逗号:
    z,patchSize=1
    复制代码时键入错误,我在问题中修复了它,但问题仍然存在。请提供一个。我强烈怀疑此行为取决于
    dx
    dy
    dz
    patchSize
    的值。此外,我根本不明白你的输出来自哪里。我会尽量提供asap.nx,ny,nz是20(我的是20x20x20网格),dx,dy,dz为1。生成的sinkGrid是一个20x20x20数组。setValue中的where参数似乎要做的是创建一个8000x1布尔数组,该布尔数组在分解时对应于20x20x20网格。where子句中的严格不等式(>,这似乎很有效,谢谢。我发现直接创建布尔网格更容易,但这似乎仍然有效。你认为呢?对于sinkCoords.iteritems()中的pos,v:tmpGrid=[False for uu in range(8000)]I=np.ravel_multi_index([pos[0],pos[1],pos[2],(20,20))tmpGrid[I]=True sinkGrid.setValue(v,其中=tmpGrid)
    (15.5, 15.5, 1.5)
    (15.5, 15.5, 2.5)
    (15.5, 16.5, 1.5)
    (15.5, 16.5, 2.5)
    (16.5, 15.5, 1.5)
    (16.5, 15.5, 2.5)
    (16.5, 16.5, 1.5)
    (16.5, 16.5, 2.5)