2016-03-25 16 views
0

3247 197x10 boyut matrislerim var. Onları taramak zorundayım ve eğer bir değer 1'in üzerinde ise, 1'e eşit olacak şekilde ayarlayın. Eğer bir değer 1'den küçük veya ona eşitse, onu sıfıra ayarlamak istiyorum. Sonra, bu değiştirilmiş matrisi almalı ve diğer 3246 setlerinin değiştirilmiş matrislerine eklemeliyim. Ben bir dosyaya bu kaydedebilirsiniz böylece devam eden koşu toplamları tutmak için m_ongoing istediğinizEşik değere göre numpy değişim öğeleri ve eleman eki ile eleman yap

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 

: İşte ben bugüne kadar ne var. Ancak, çalışmıyor ve sadece döngüdeki son m_cur yazıyor gibi görünüyor. Eğer döngüyü toplam 3 kez çalıştırırsam, tüm karşılıklı olarak 1 tane olan bazı hücreler vardır, bu yüzden birkaç üçlük beklerim. Kesinlikle 2s bekliyorum ama sadece 1s ve 0s görüyorum.

Yapmaya çalıştığım şeyi yapmanın en iyi yolu nedir? matrisleri bir sürü Kendine iyi

ve her hücre için çalışan toplamları oluşturmak için eleman bütün eleman eklemek koşulu

dayalı

-Change değerler.

+1

İlk etapta m_ongoing'i nasıl yaratıyorsunuz? Dönen bir yerde _outside_ 'm_ongoing = np.zeros (SIZE)' gibi bir şey olduğunu varsayalım? Aksi takdirde, bu çalışması gerektiği gibi görünüyor. Beklentilerinizin doğru olduğundan emin misiniz? (Aynı dosyayı iki kez geçirerek bunu test edebilirsiniz ... Sonra tüm 0s ve 2s olmalıdır.) – mgilson

cevap

1

Sen bir soruyu da yanıtlayan 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) 

DÜZENLEME kullanabilirsiniz:

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

Clip, 0 değerinden 0'a eşit değerler ve 1'den büyük değerler 1'e eşittir. 1'den küçük veya ona eşit olan değerler 0 ve 1'den büyük değerler 1'den büyük olmalıdır. – jonnyd42

+0

Hatam doğru soruya cevap vermek üzere düzenlenmiştir. – RootTwo

+0

Müthiş. Teşekkürler! – jonnyd42

0

@RootTwo anlaşılacağı gibi, klip() güzel numpy yerleşik olduğunu. Ancak performans nedenlerinden ötürü, verilerinize ait 3B "yığınında" vektörel işlemleri kullanabilirsiniz.

Örnek:

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)

DÜZENLEME: Zamanlama Re ekleme sults ve Yanıtımı Değiştirme

Bu yüzden bir derinlik yığını oluşturma tavsiyem görünecek ve klipin tek bir uygulamasını kullanacak ve toplam işlevler önerilmez. Zamanlama testleri yaptım ve artımlı yöntemin daha büyük olduğunu, büyük olasılıkla büyük 3D dizinin tahsis edilmesinin tahsisat zamanına bağlı olduğunu keşfettim.

Her iki yöntemde olduğu gibi, veri yükleme yönünü de hesaba kattığım testler. İşte, i123'deki iki yöntemi %timeit makrosuyla karşılaştıran sonuçlar.

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 döngüler, 3 en: 28.döngü başına 1 ms

%timeit x2 = f2(some_data) 

10 döngüler, 3 en: döngü başına 103 ms

Böylece aşamalı tek bir işlem sonrası olarak genel işlem yaparak bir 3.7x hızlanma var verileri istifleme.