2016-02-24 72 views
5

我想模擬使用python數組進行基本單元劃分。我具有u,這是通過定義一個數組的數組:將數組中的一個元素更改爲兩個,然後刪除原始數據(單元劃分模擬)

n=2 #number of elements that can describe each cell 
N=2 # number of cells 
u=[np.zeros((n,n)) for i in range(N)] 
V=2.0 
epsilon=2.0 

每個U [i]表示在系統中的小區和u是整個系統。接下來,我定義一些函數,稍後我將用它來爲我的細胞分裂算法。

Mx=np.zeros((n,n)) 
My=np.zeros((n,n)) 

for x in range (n): 
    Mx[x]=x-n/2 

for y in range (n): 
    My[y]=y-n/2 

在這裏,我初始化我的細胞,使他們採取1或0的值:

for i in range(N): 
    for x in range(n): 
     for y in range(n): 
      if (x-n/2)**2+(y-n/2)**2<5: u[i][x,y]=1 

我傳播我的手機後,我想檢查已經不是長大了的細胞,讓我們說,體積V

for i in range (N): 
     if (np.sum([i]>V):  
      theta=random.uniform(0, 2*math.pi) 
      u.append(np.zeros((n,n))) 

      u[-1]=u[i]/2.0* (1+np.tanh((math.cos(theta)*Mx+math.sin(theta)*My/epsilon))   
      u[i]=u[i]/2.0* (1-np.tanh((math.cos(theta)*Mx+math.sin(theta)*My)/epsilon)) 
      N+=1 

現在我說,如果我的體積比規定的體積V越大,那麼我單元添加到系統中(通過附加爲零的數組),我定義我的兩個子細胞

u[-1]=u[i]/2.0*(1-np.tanh((math.cos(theta)*Mx+math.sin(theta)*My/epsilon)) 

u[i]=u[i]/2.0* (1+np.tanh((math.cos(theta)*Mx+math.sin(theta)*My/epsilon)) 

其中新U [I]數組代替我原來的一個。 可替換地,我試圖追加2個np.zero((N,N))陣列和定義我的兩個子細胞如

u[-1] and u[-2] 

然後刪除與

del u[i] 

但沒與原始親本細胞也不行。在我運行這段代碼之後,我得到的數組比我更多。如果N = 2,那麼細胞分裂後我應該有N = 4。

理想我想我原來ü陣列看起來是這樣的:

u=[array([[0,1], [1,0]]), array([[1,1],[1,0]])] 

,我要檢查,如果

np.sum(u[0])>V 

話,我會定義兩個新的組件集成到U,即

u[-1] and u[i] 

其中新的u [i]代替原來的u [i]

因爲

np.sum(u[0]) and np.sum(u[1]) are both > V 

然後我的新ü陣列應類似於此:

u=[array([[1,1], [1,0]]), 
    array([[1,1], [1,0]]), 
    array([[1,1], [1,0]]),   
    array([[1,1], [1,0]])] 

(這在我的數組值只是示例值。真正的價值取決於我的功能

u[-1]=u[i]/2.0*(1+np.tanh((math.cos(theta)*Mx+math.sin(theta)*My/epsilon))   

    u[i]=u[i]/2.0*(1- np.tanh((math.cos(theta)*Mx+math.sin(theta)*My)/epsilon)) 

回答

1

我注意到,代碼無法運行。

我覺得是不正確的是:

if (np.sum([i]>V):進行修改,我想爲if np.sum([i])>V:

一個支架閉合在缺:

u[-1]=u[i]/2.0*(1-np.tanh((math.cos(theta)*Mx+math.sin(theta)*My/epsilon)) 
u[i]=u[i]/2.0*(1+np.tanh((math.cos(theta)*Mx+math.sin(theta)*My/epsilon)) 

的V缺失值,和Epsilon。至少需要V才能理解預期的輸出形狀。

請在u中編寫預期輸出形狀的示例,以瞭解您想要執行的操作。也許這與n = 2更好,因此u的尺寸更小。

更新: 隨着新的信息,我認爲我更好地理解任務。請檢查下面的代碼是否符合您的期望。

檢查constant是否是正確的等式。

檢查if (np.sum(u[i])>V):是否正確。

import numpy as np 
import math 
import random 
n=2 #number of elements that can describe each cell 
N=2 # number of cells 
u=[np.zeros((n,n)) for i in range(N)] 
V=2.0 
epsilon=2.0 

Mx=np.zeros((n,n)) 
My=np.zeros((n,n)) 

for x in range (n): 
    Mx[x]=x-n/2 

for y in range (n): 
    My[y]=y-n/2 

for i in range(N): 
    for x in range(n): 
     for y in range(n): 
      if (x-n/2)**2+(y-n/2)**2<5: u[i][x,y]=1 
lenu = len(u) 
for i in range (lenu): 
    if (np.sum(u[i])>V): 
     print(u[i], i, u, len(u)) 
     theta=random.uniform(0, 2*math.pi) 
     constant = np.tanh((math.cos(theta)*Mx+math.sin(theta)*My)/epsilon) 
     u_end = u[i]/2.0*(1 + constant)  
     u[i] = u[i]/2.0*(1 - constant) 
     u.append(u_end) 
     N+=1 
+0

我已經更新了我的帖子,希望我這次更清楚了。 V和epsilon只是我可以定義的常量,我們給它們賦值爲2.0。 – myblackdress

+0

請告訴我,如果我的更新接近你想要做的。 – Mantxu

0

要隔離這個問題,讓我們來看看它的一些複雜性。 NumPy和有絲分裂的確切條件與如何用兩個序列替換一個項目無關。另外無關緊要的是如何創建這些新元素。

因此我們假設我們的單元格由字母數字字符串表示。那些完全大寫的是他們進入細胞分裂的時刻。我們可以模擬過程如下:

from itertools import chain 

cells = ['a', 'B', 'C', 'D', 'e', 'F'] # Consonants grow quicker than vowels ;-) 

# mitosis: 
cells = list(
    chain.from_iterable(
     [ 
      '{}1'.format(cell.lower()), 
      '{}2'.format(cell.lower()), 
     ] if cell == cell.upper() else [cell] for cell in cells 
    ) 
) 
# Now, cells == ['a', 'b1', 'b2', 'c1', 'c2', 'd1', 'd2', 'e', 'f1', 'f2'] 

(。見documentation for itertools.chain.from_iterable我餵養它一個generator expression生成器表達式的工作方式與list comprehensions,但沒有明確構建一個列表)

我們可以通過拔出一些功能使其更容易理解:

from itertools import chain 

def is_ready_for_mitosis(cell): 
    return cell == cell.upper() 

def perform_mitosis(cell): 
    first_new_cell = '{}1'.format(cell.lower()) 
    second_new_cell = '{}2'.format(cell.lower()) 
    return first_new_cell, second_new_cell 

def perform_mitosis_if_ready(cell): 
    if is_ready_for_mitosis(cell): 
     return perform_mitosis(cell) 
    # (else) 
    return (cell,) 

cells = ['a', 'B', 'C', 'D', 'e', 'F'] 

# mitosis: 
cells = list(chain.from_iterable(perform_mitosis_if_ready(cell) for cell in cells)) 
# Now, cells == ['a', 'b1', 'b2', 'c1', 'c2', 'd1', 'd2', 'e', 'f1', 'f2'] 

現在我所做的所有簡化都封裝在第一個函數中。因此,要根據您的情況使用第三個函數和基於itertools的更新過程,只需按照您認爲合適的方式重新實現前兩個函數即可。

相關問題