2016-03-25 33 views
0

我有3247個197x10維度矩陣。我需要掃描它們,如果值大於1,則將其設置爲1.如果值小於或等於1,則要將其設置爲零。然後,我必須將這個修改後的矩陣添加到其他3246組的修改後的矩陣中。以下是我迄今爲止:Numpy基於閾值更改元素,然後逐個添加元素

for i in range(LOWER, UPPER + 1): 
    fname = file_name+str(i)+".txt" 
    cur_resfile = np.genfromtxt(fname, delimiter = ",", skiprows = 1) 
    m_cur = cur_resfile 

    m_cur[m_cur <= 1] = 0 
    m_cur[m_cur > 1 ] = 1 

    m_ongoing = m_ongoing + m_cur 

我想m_ongoing保持當前的運行總和,這樣我可以保存這一個文件。但是,它不起作用,似乎只是寫入循環中的最後一個m_cur。如果我總共運行3次循環,有一些單元全部相互具有1,所以我期望有三個單元。我絕對期待很多2s,但我只看到1s和0s。

什麼是最好的方式來做我想做的事情?基於條件

-Take很多矩陣和通過添加元素的所有元素來創建針對每個小區運行總和

- 改變值。

+1

你最初在哪裏創建'm_ongoing'?我假設你有''m_ongoing = np.zeros(SIZE)''這個循環的某個地方嗎?否則,這看起來應該起作用。你確定你的期望是正確的嗎? (你可以通過兩次傳遞相同的文件來測試它...然後它應該是全0和2s) – mgilson

回答

1

你可以使用numpy.clip()

for i in range(LOWER, UPPER + 1): 
    fname = file_name+str(i)+".txt" 

    cur_resfile = np.genfromtxt(fname, delimiter = ",", skiprows = 1) 

    m_ongoing += cur_resfile.clip(0,1) 

編輯回答這是問的問題:

m_ongoing = np.zeros((197,10)) 

for i in range(LOWER, UPPER + 1): 
    fname = file_name+str(i)+".txt" 
    cur_resfile = np.genfromtxt(fname, delimiter = ",", skiprows = 1) 

    # add one to the places where cur_file > 1 
    m_ongoing[cur_resfile > 1] += 1 
+0

剪輯將使得小於0的值等於0,大於1的值等於1.我想要的是小於或等於1的值爲0,大於1的值爲1. – jonnyd42

+0

我的錯誤編輯爲回答正確的問題。 – RootTwo

+0

太棒了。謝謝! – jonnyd42

0

由於@RootTwo表明,夾子()是一個不錯的numpy的內置。但出於性能原因,您可以在數據的3D「堆棧」上使用矢量化操作。

實施例:

import numpy as np 
#simulating your data as a list of 3247 2D matrices, each 197x10 
some_data = [np.random.randint(-2,2,(197,10)) for _i in range(3247)] 
#stack the matrices 
X = np.dstack(some_data) 
print(X.shape) 

(197,10,3247)

Y = X.clip(0,1) 
Z = Y.sum(axis=2) 
#Z is now the output you want! 
print(Z.shape) 

(197,10)

編輯:添加時序再並改變我的答案

所以看來我的建議是創建一個深度堆棧和使用剪輯和總和功能的單個應用程序是不明智的。我運行了一些時序測試,發現增量式方法更快,主要可能是由於分配大型3D陣列的分配時間開銷。

這裏是測試,我正在分解數據加載方面,因爲它將以相同的方式。以下是將ipython中的兩種方法與%timeit宏比較的結果。

import numpy as np 
# some_data is simulated as in the above code sample 
def f1(some_data): 
    x = some_data[0] 
    x = x.clip(0,1) 
    for y in some_data[1:]: 
     x += y.clip(0,1) 
    return x 

def f2(some_data): 
    X = np.dstack(some_data) 
    X = X.clip(0,1) 
    X = X.sum(axis=2) 
    return X 

%timeit x1 = f1(some_data) 

10循環,最好的3:28。1毫秒每循環

%timeit x2 = f2(some_data) 

10圈,最好的3:每圈103毫秒

所以這是做的過程中逐漸對作爲後一個操作的3.7倍加速堆疊數據。

相關問題