अजगर का उपयोग करके एक क्षेत्र से अद्वितीय मूल्यों की एक सूची निकालने की कोशिश कर रहा है


11

मेरे पास एक FGDB के भीतर कई तालिकाओं में कई स्तंभ हैं जहां मुझे प्रत्येक स्तंभ के लिए अद्वितीय मान निकालने की आवश्यकता है।

उदाहरण के लिए: मान [1,2,2,2,3,4] हो सकता है, और मैं [1,2,3,4] लौटने की कोशिश कर रहा हूं

मैं ARCGIS में इस काम को कई अन्य तरीकों से कर सकता था लेकिन मैं खुद को बढ़ाने की कोशिश कर रहा हूं।

मैंने वेब पर अजगर का एक टुकड़ा पाया है जो मुझे लगता है कि काम करेगा लेकिन मैं इसे चलाने के लिए इसे प्राप्त करने के लिए संघर्ष कर रहा हूं (मुझे एक अवैध सिंटैक्स त्रुटि मिलती रहती है क्योंकि मुझे लाइन 3 में वाक्यविन्यास त्रुटि मिलती रहती है) यह कोई संदेह नहीं होगा एक बहुत ही सरल उपयोगकर्ता त्रुटि।

नीचे कोड स्निपेट

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})

यह त्रुटि संदेश है जो मुझे उदात्त पाठ से मिलता है:

 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]

मूल प्रश्न से अपडेट

मैंने अब नीचे दिए गए उत्तर के साथ अपने कोड को अपडेट कर दिया है, लेकिन एक माध्यमिक त्रुटि को दूर कर रहा हूं।

नया कोड स्निपेट:

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)

मुझे एक रनटाइम त्रुटि से संबंधित एक नया त्रुटि संदेश मिल रहा है

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'

[बाहर निकलें कोड 1 के साथ 8.0 में समाप्त]

मैंने जो रीडिंग की है उससे मुझे लगता है कि यह env.workspace सेट करने से संबंधित है?

बस सबूत दिखा रहा है कि यह मौजूद है


1
कृपया संपादित अपने प्रश्न अपने पूरे त्रुटि (पाठ) संदेश को शामिल करने
Midavalo

आपकी नई त्रुटि के बारे में env.workspaceमुझे नहीं सोचना चाहिए। rपथ से पहले या तो उतारने का प्रयास करें , या मार्ग में \` to ` बदल (और rवहाँ छोड़ दें )। क्या उस जियोडेटाबेस मौजूद है?
Midavalo

क्या आप एक क्षेत्र में सभी अद्वितीय मूल्यों को अलग करने की कोशिश कर रहे हैं? उदाहरण के लिए, मान लें कि आपके पास निम्न मूल्य हैं [1,2,2,2,3,4], क्या आप लौटने की कोशिश कर रहे हैं [1,2,3,4]। कृपया इस जानकारी को शामिल करने के लिए पोस्ट को अपडेट करें।
एरोन

@Midavalo आप इस तरह पथ tolook बदलते मतलब किया r'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
लिथ हॉकिन्स

1
धन्यवाद - fruther सबूत जो बहुत स्मार्ट नहीं हैं, लेकिन मैं भारी चीजें उठा सकता हूं। मैं तुम्हें एक उल्लास देना !!
लीथ हॉकिन्स

जवाबों:


14

आपको बहुत मिल गया है, आपको बस अपने मापदंडों का नाम tableऔर fieldअपने फ़ंक्शन की परिभाषा निर्दिष्ट करने की आवश्यकता है , और फिर फ़ंक्शन को कॉल करने पर उन मानों को पास करें। अपने इंडेंटेशन को भी देखें, क्योंकि यह पायथन के लिए महत्वपूर्ण है।

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)

मूल रूप से यह कह रहा है कि जब आप फ़ंक्शन को कॉल करते हैं unique_values()तो आप दो मापदंडों को मान देंगे, एक को बुलाया जाता है table, दूसरे को बुलाया जाता है field। ये तब आपके फ़ंक्शन में उपयोग किए जाते हैं। जब आप फ़ंक्शन को कॉल करते हैं, तो लाइन में

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

आप इन मापदंडों को मान दे रहे हैं।

यह आपके मापदंडों को अलग-अलग घोषित करने और उन्हें सीधे कर्सर में पारित करने के समान है:

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

आह कि समझ में आता है, जब आप नीचे दिए गए अलग-अलग पैरामीटर्स को शामिल करते हैं तो मुझे लगता है कि आप थैंक्यू कह रहे हैं! । मुझे पता है कि त्रुटियों की श्रृंखला बढ़ रही है क्योंकि मुझे एक रन टाइम त्रुटि मिल रही है जो मुझे मौजूदा डेटाबेस को खोलने की अनुमति नहीं दे रही है। बीमार मेरे सवाल का अद्यतन करें।
लीथ हॉकिन्स

जब सॉर्ट किए गए () फ़ंक्शन को डुप्लिकेट लौटाता है, तो ["a", 'b ’,' a’, 'b ’] जैसी साधारण सूची पर चलने पर प्रत्येक मान का केवल एक अनूठा उदाहरण क्यों होता है? मैं कुछ समय के लिए इस उत्तर का उपयोग कर रहा हूं और महसूस किया कि मुझे समझ नहीं आया कि यह क्यों काम करता है।
डायलन वारबर्ग

2
@DylanWarburg क्योंकि आप मूल्यों की एक सूची नहीं दे रहे हैं, आप एक सेट से गुजर रहे हैं । यदि आप एक सेट में अपनी सूची आइटम जोड़ते हैं, उदाहरण के लिए set(['a', 'b', 'a', 'b']), यह अद्वितीय मान लौटाएगा {'a', 'b'}sorted()एक साधारण सेट के रूप में केवल क्रमबद्ध क्रम में उन्हें वापस लौटाने का उपयोग करना अनसुलझा है।
Midavalo

यदि आप जिस फ़ील्ड से अनन्य मान ढूंढ रहे हैं वह स्ट्रिंग नहीं है, तो आपको जोड़ना चाहिए: रिटर्न सॉर्ट किया गया ({str (पंक्ति [0]) कर्सर में पंक्ति के लिए)
MKelly

8

मैं अनूठे मूल्यों को खोजने के लिए एक जनरेटर अभिव्यक्तिset() के साथ पायथन के अंतर्निहित फ़ंक्शन का उपयोग करने की सलाह दूंगा । आप इस दृष्टिकोण को बड़े या छोटे डेटासेट के साथ बेहद कुशल पाएंगे: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 का जवाब है और साथ ही {} ब्रेसिज़ का उपयोग किसी सेट ऑब्जेक्ट को परिभाषित करने के लिए किया जा रहा है ।
user2856

1
मैंने उसी बात का सुझाव देने पर विचार किया। यदि आप जो चाहते हैं वह एक सूची है तो आप सेट को हमेशा देशी पायथन सूची () एफएक्स के साथ एक सूची में बदल सकते हैं।
अक्टूबर को jbchurchill

3

निम्नलिखित दृष्टिकोण https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ पर प्रकाशित किया गया था। यह चापलूसी और सुस्वादु का उपयोग कर रहा है और इसकी तुलना में छोटा मेमोरी फ़ुटप्रिंट है SearchCursor दृष्टिकोण।

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

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इसे किसी के लिए भी छोड़ दूंगा जो इस मदद की तलाश में ठोकर खाए। arcpy.Frequency_analysis()एक क्षेत्र से सभी अद्वितीय मूल्यों को जल्दी से उपयोग करके एक नई तालिका में रखा जाता है, जिसे आप तब कर्सर संचालन के लिए उपयोग कर सकते हैं। एक एकल आदेश यह करने के लिए कि ये सभी अन्य उपाय क्या करते हैं और तेज और आसान। एक बोनस के रूप में, आपको यह भी गणना मिलती है कि प्रत्येक मूल्य कितनी बार दिखाई देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.