2013-02-03 160 views
0

我有一個使用numpy.loadtxt製作的numpy ndarray。我想根據第三列中的條件從它中拉出整行。例如:如果array [2] [i]符合我的條件,那麼也可以獲得array [0] [i]和array [1] [i]。我是python新手,還有所有的numpy功能,所以我正在尋找最好的方法來做到這一點。理想情況下,我想在同一時間拉2行,但我不會總是有偶數行的,所以我想這是一個問題從numpy數組中提取數據

import numpy as np 

''' 
Created on Jan 27, 2013 

@author: 
''' 
class Volume: 

    f ='/Users/Documents/workspace/findMinMax/crapc.txt' 
    m = np.loadtxt(f, unpack=True, usecols=(1,2,3), ndmin = 2) 


    maxZ = max(m[2]) 
    minZ = min(m[2]) 
    print("Maximum Z value: " + str(maxZ)) 
    print("Minimum Z value: " + str(minZ)) 

    zIncrement = .5 
    steps = maxZ/zIncrement 
    currentStep = .5 
    b = [] 

    for i in m[2]:#here is my problem 
     while currentStep < steps: 
      if m[2][i] < currentStep and m[2][i] > currentStep - zIncrement: 
       b.append(m[2][i]) 
      if len(b) < 2: 
       currentStep + zIncrement 

       print(b) 

下面是一些代碼,我在java中這樣做是我想要什麼的總體思路:

while(e < a.length - 1){ 
for(int i = 0; i < a.length - 1; i++){ 
     if(a[i][2] < stepSize && a[i][2] > stepSize - 2){ 

      x.add(a[i][0]); 
      y.add(a[i][1]); 
      z.add(a[i][2]); 
     } 
     if(x.size() < 1){ 
      stepSize += 1; 
     } 
    } 
} 
+0

這很有道理!對不起,我很遺憾。我還沒有學會像程序員那樣思考。我是一名生物學生,必須學習這一點。 :/ – pioneer903

回答

2

首先,你可能不希望把你的代碼在類定義...

import numpy as np 


def main(): 
    m = np.random.random((3, 4)) 
    mask = (m[2] > 0.5) & (m[2] < 0.8) # put your conditions here 
             # instead of 0.5 and 0.8 you can use 
             # an array if you like 
    m[:, mask] 

if __name__ == '__main__': 
    main() 

mask是一個布爾數組,m[:, mask]是你想要的數組

m [2]是m的第三行。如果輸入m[2] + 2,則會得到一箇舊值爲2的新陣列。m[2] > 0.5將創建一個具有布爾值的數組。這是最好的嘗試這個東西出來與IPython中(www.ipython.org)

在表達m[:, mask]:的意思是「採取所有行」,面具描述的列應包括在內。

更新

下一個嘗試:-)

for i in range(0, len(m), 2): 
    two_rows = m[i:i+2] 
+0

我不明白我如何能像這樣遍覽整個ndarray。你能否詳細說明一下? – pioneer903

+0

我認爲我們是誤解,它是我的錯,我不擅長解釋想法 – pioneer903

+0

什麼部分我沒有正確理解?你可能想看看http://scipy.org/Tentative_NumPy_Tutorial – aseyboldt

0

如果你可以寫你的條件作爲一個簡單的功能

def condition(value): 
    # return True or False depending on value 

,那麼你可以選擇你這樣的子陣:

cond = condition(a[2]) 
subarray0 = a[0,cond] 
subarray1 = a[1,cond] 
+0

你能詳細說明真假嗎?我並不完全瞭解你。對不起,我還在學習。 – pioneer903

+0

我的意思是,這取決於你的病情。如果你幸運的話,你可以使用標準函數來表達條件,這樣它就可以在沒有元素循環的數組'a [2]中操作,例如'return value> 0'或'return(value.abs( )> 0.5)*(np.sin(value)<0.3)'也可以工作,如果'value'是一個數組而不會減慢循環代碼。 – flonk