Python kullanarak bir alandan Benzersiz Değerler listesini çıkarmaya çalışmak


11

Her sütun için benzersiz değerleri ayıklamak gereken bir FGDB içinde tablolar bir dizi sütun bir dizi var.

Örneğin: değerler [1,2,2,2,3,4] olabilir ve geri dönmeye çalışıyorum [1,2,3,4]

Bu işi ARCGIS'te bir dizi başka yolla yapabilirdim ama kendimi genişletmeye çalışıyorum.

İşi yapacağını düşündüğüm web'de bir parça python buldum ama çalıştırmak için uğraşıyorum (3. satırda sözdizimi hatası almaya devam ederken geçersiz bir sözdizimi hatası almaya devam ediyorum) bu şüphesiz olacak gerçekten basit bir kullanıcı hatası.

Kod Parçacığı aşağıda

import arcpy

def unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
with arcpy.da.SearchCursor(table, [field]) as cursor:
    return sorted({row[0] for row in cursor})

Bu yüce metinden aldığım Hata Mesajı:

 File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 3
def unique_values(r'N:\GISProjects\Steve_Eastwood_Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
                                                                                                                             ^
SyntaxError: invalid syntax
[Finished in 0.1s with exit code 1]

Orijinal Sorudan Güncellemeler

Şimdi aşağıda verilen cevap ile kodumu güncelledim ama ikincil bir hata alıyorum.

Yeni Kod Parçacığı:

import arcpy

def unique_values(table , field):
    with arcpy.da.SearchCursor(table, [field]) as cursor:
        return sorted({row[0] for row in cursor})

myValues = unique_values(r'N:\\GISProjects\\Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

Bir çalışma zamanı hatasıyla ilgili yeni bir hata mesajı alıyorum

Traceback (most recent call last):
File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 7, in <module>
myValues = unique_values(r'N:\\GISProjects\\Steve_Eastwood_Landuse \Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')
 File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 4, in unique_values
with arcpy.da.SearchCursor(table, [field]) as cursor:
RuntimeError: cannot open 'N:\\GISProjects\\Steve_Eastwood_Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge'

[Çıkış kodu 1 ile 8.0'larda tamamlandı]

Okuma yaptığımdan bunun env.workspace'in ayarlanmasıyla ilgili olduğunu varsayıyorum.

Sadece var olduğunu kanıtla


1
lütfen tüm hata mesajınızı içerecek şekilde sorunuzu düzenleyin (metin olarak)
Midavalo

Yeni hatanızın, sanmıyorum ile env.workspaceilgisi olmamalıdır. Yoldan rönce kalkmayı veya yoldaki \` to `` değiştirmeyi deneyin (ve roradan ayrılın ). Bu Geodatabase var mı?
Midavalo

Bir alandaki tüm benzersiz değerleri ayırmaya mı çalışıyorsunuz? Örneğin, aşağıdaki değerlere [1,2,2,2,3,4]sahip olduğunuzu varsayalım, geri dönmeye çalışıyorsunuz [1,2,3,4]. Lütfen bu bilgileri eklemek için yayını güncelleyin.
Aaron

@Midavalo, yol görünümünü böyle değiştirmek istediniz mi? R'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
Leith Hawkins

1
Teşekkürler - im çok akıllı değil ama ağır şeyler kaldırabilir kanıtı. Sana bir büyü borçluyum !!
Leith Hawkins

Yanıtlar:


14

Hemen hemen aldınız, parametrelerinizin adını tableve fieldişlev tanımınızı belirtmeniz ve ardından işlevi çağırdığınızda bu değerleri iletmeniz yeterlidir . Ayrıca Python için hayati önem taşıyan girintinizi de izleyin.

def unique_values(table , field):
    with arcpy.da.SearchCursor(table, [field]) as cursor:
        return sorted({row[0] for row in cursor})

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

Temelde bu işlevini çağırdığınızda söylüyor unique_values()sen iki parametre olarak adlandırılan birine değer geçirmek edeceğiz tableadlandırılan diğer field. Bunlar daha sonra işlevinizde kullanılır. İşlevi çağırdığınızda,

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')  

değerleri bu parametrelere aktarıyorsunuz.

Bu, parametrelerinizi ayrı ayrı bildirmek ve doğrudan imlece aktarmakla aynı şeydir:

table = r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge'
field = 'LU_ALUMMaj'

with arcpy.da.SearchCursor(table, [field]) as cursor:
    myValues = sorted({row[0] for row in cursor})

print myValues

ahh bu mantıklı, aşağıdaki bireysel parametreleri eklediğinizde size söylediklerinizi teşekkür ederim! . Mevcut veritabanını açmama izin vermeyen bir çalışma zamanı hatası alıyorum gibi hatalar zincirini yukarı hareket biliyorum. Sorumu güncelleyeceğim.
Leith Hawkins

Sort () işlevi, ['a', 'b', 'a', 'b'] gibi basit bir listede çalıştırdığınızda, sort () işlevi yinelemeleri döndürdüğünde, neden her bir değerin yalnızca bir benzersiz örneğini döndürür? Bu cevabı bir süredir kullanıyorum ve neden işe yaradığını anlamadığımı fark ettim.
Dylan Warburg

2
Eğer bir geçmediğine Çünkü @DylanWarburg liste değerlerinin, bir geçiyoruz seti . Yukarıdaki liste öğelerinizi bir kümeye eklerseniz, örneğin set(['a', 'b', 'a', 'b'])benzersiz değerler döndürür {'a', 'b'}. sorted()Basit bir küme ayrıştırıldığından bunları kullanmak sıralı düzende döndürür.
Midavalo

Eşsiz değerler aradığınız alan bir dize değilse şunu eklemelisiniz: sıralı dönüş (
imleçteki

8

Eşsiz değerleri bulmak için bir jeneratör ifadesi olarak Python'un yerleşik set()işlevini kullanmanızı tavsiye ederim . Bu yaklaşımı büyük veya küçük veri kümelerinde son derece verimli bulacaksınız:SearchCursor

import arcpy

fc = r'C:\path\to\your.gdb\featureclass'

unique_values = set(row[0] for row in arcpy.da.SearchCursor(fc, "some_field"))

1
@ Midavalo'nun cevabının yaptığı şey budur ve {} kümeleri küme nesnesini tanımlamak için kullanılmaktadır .
user2856

1
Aynı şeyi önermeyi düşündüm. İstediğiniz bir liste ise, seti her zaman yerel python listesiyle () fx içeren bir listeye dönüştürebilirsiniz.
jbchurchill

3

Aşağıdaki yaklaşım https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ adresinde yayınlanmıştır. Arcpy ve numpy kullanıyor ve SearchCursor yaklaşımı.

import arcpy
import numpy

def unique_values(table , field):
    data = arcpy.da.TableToNumPyArray(table, [field])
    return numpy.unique(data[field]).tolist()

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

0

Bunun eski bir soru olduğunu biliyorum, ama yardım almak için tökezleyen herkes için bunu burada bırakacağım. Kullanmak arcpy.Frequency_analysis(), bir alandaki tüm benzersiz değerleri hızlı bir şekilde yeni bir tabloya koyar; bu tablo daha sonra imleç işlemleri için kullanabilirsiniz. Tüm bu diğer çözümlerin yaptıklarını ve daha hızlı ve kolay bir şekilde yapmak için tek bir komut. Bonus olarak, her bir değerin kaç kez göründüğünü de görebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.