2012-10-26 14 views
6

Sıfır değerleri depolamak için python A[row,col,value]'da koordineli bir depolama listemiz var.İç sayfadaki ilk öğeler mümkün olduğunca verimli

Tüm satır dizinlerinin listesini nasıl alabilirim? Bu A[0:][0], print A[0:] tüm listeyi yazdırmayı bekledim ancak print A[0:][0] yalnızca A[0] yazdırır.

sormak nedeni, n satır sayısı olduğu range(0,n) yineleme her satır yani içindeki sıfır olmayan değerlerin sayısını etkili bir şekilde hesaplanması içindir. Bu ucuz for i in range(0,n): for j in A: ... geçerli yolumdan daha fazla olmalıdır.

şey gibi:

c = [] 
# for the total number of rows 
for i in range(0,n): 
    # get number of rows with only one entry in coordinate storage list 
    if A[0:][0].count(i) == 1: c.append(i)     
return c 

Üzeri:

c = [] 
# for the total number of rows 
for i in range(0,n): 
    # get the index and initialize the count to 0 
    c.append([i,0]) 
    # for every entry in coordinate storage list 
    for j in A: 
     # if row index (A[:][0]) is equal to current row i, increment count 
     if j[0] == i: 
      c[i][1]+=1 
return c 

DÜZENLEME: numarayı döndürmek için (aşağıdaki ile geldi

Junuxx yanıtını, this question ve this post kullanma için daha hızlı olan tek satırlı satırların Benim şu anki sorunum, A orijinal denememden daha büyük. Ancak hala satır ve sütun sayısı ile büyür. A üzerinden yinelemek zorunda olmasa da sadece n'a kadar mı acaba?

# get total list of row indexes from coordinate storage list 
row_indexes = [i[0] for i in A] 
# create dictionary {index:count} 
c = Counter(row_indexes)  
# return only value where count == 1 
return [c[0] for c in c.items() if c[1] == 1] 
+1

@larsman: Ne üçe bir liste olduğunu varsayalım. – Junuxx

+0

Evet, anladın. –

+1

Yapmaya çalıştığınız şeyin basit, verimsiz bir örneğini yazabilir misiniz? Sorunun metnini gerçekten kafa karıştırıcı buluyorum ve örnek kod bloklarınızın hiçbiri aynı şeyi yapmıyor gibi görünüyor ..? – dbr

cevap

10

Bu yapmalıyım:

c = [x[0] for x in A] 

O A her elemanın ilk (alt) elemanını alan bir liste anlama var.

+0

Bu, özgün çözümümden çok daha iyi performans gösteriyor. Lütfen benim düzenlememe bakın, ancak A üzerinden yineleme mümkün değil mi? Çok takdir! –

+0

A çok büyükse, ancak A öğesinin öğeleri yalnızca üç üyeye sahipse, üç liste, "satır", "sütun" ve "değer" değerlerini depolamak daha verimli olabilir. Tüm satır numaralarını anında alabileceksiniz ve üç listenin tümü için aynı indeksi kullanarak tek bir girişe erişebilirler (bunlar hizalanır). Hem A hem de alt listeler uzunsa, iç içe geçmiş listeler yerine, numpy tarafından sağlanan (bkz. Jon Clements'in cevabı gibi) gerçek iki boyutlu veri yapısının kullanılması daha iyi olabilir. – Junuxx

4

verimlilik ve genişletilmiş dilimler için, numpy kullanabilirsiniz - iyi bir fikir gibi görünüyor senin örneğin verilen hangi:

import numpy as np 
yourlist = [ 
    [0, 0, 0], 
    [0, 1, 1], 
    [1, 0, 2] 
] 
a = np.array(yourlist) 
print a[:,0] 
# [0 0 1] 
bc = np.bincount(a[:,0]) 
# array([2, 1]) 
count = bc[bc==1].size 
# 1 
# or... (I think it's probably better...) 
count = np.count_nonzero(bc == 1) 
+0

Çalışmak için bir örnek veremiyorum .. tür (mylist [0] [0]) 'döner' int', 'tür (a [0] [0])' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' = numpy.array (mylist) 'bincount'ı denediğimde (a [:, 0])' TypeError 'ı alırım: dizi güvenli bir şekilde türüne gönderilemez' denedim 'bc = numpy.bincount (numpy.arange (a [:, 0] d_type = numpy.int)) 've hata' TypeError: sadece uzunluk-1 dizileri Python scalars''na dönüştürülebilir' –

+0

@sudo_o Bunun hakkında ne söyleyeceğime emin değilim - np.array'dan sonra (np.arange' değil) tür (a [0] [0]) ' ile yukarı ve her şey sadece çalışır ... –

İlgili konular