पायथन का उपयोग करके ASCII रास्टर डेटासेट में न्यूनतम और अधिकतम मान निर्धारित करना?


12

मेरे पास ASCII प्रारूप में एक रेखापुंज डेटासेट है। पायथन का उपयोग करके, मुझे डेटासेट के अंदर मूल्यों minऔर maxमूल्यों को निर्धारित करने की आवश्यकता है । मुझे बताया गया है कि हेडर की जानकारी महत्वपूर्ण है, जिसमें पंक्तियों की संख्या / कॉलम, सेल का आकार और आदि जैसी चीजें शामिल हैं।

क्या आप केवल हेडर की जानकारी को छोड़ नहीं सकते हैं minऔर maxमूल्यों और मूल्यों को निर्धारित करने के लिए संपूर्ण डेटासेट को पढ़ सकते हैं?

यही मैं करने की कोशिश कर रहा हूं। मैं पहले दो पंक्तियों को छोड़ रहा हूं जिसमें हेडर की जानकारी है, और वहां से मूल्यों को निर्धारित करने की कोशिश कर रहा हूं। निम्नलिखित में से एक है कि मेरे पास क्या है, लेकिन कुछ मार्गदर्शन की आवश्यकता है क्योंकि मैं पायथन के लिए नया हूं।

raster_file = open('data.asc', 'r') # Open the file
data = raster_file.readlines()[4:] # Read the lines in the file, and skip the first six lines

for lines in data:
    print max(data) # Find the max value in data
    print min(data) # Find hte min value in data

कोई सुझाव?


2
क्या आप खुले स्रोत या ESRI स्टैक का उपयोग कर रहे हैं?
UnderDark

जवाबों:


12

आप खसखस ​​का उपयोग कर सकते हैं। नीचे दिए गए उदाहरण देखें। कोई डेटा मानों के लिए एक नकाबपोश सरणी को उत्पन्न किया जा सकता है। Mafromtxt और genfromtxt के लिए संख्यात्मक सहायता विषय देखें

Below is a small ascii file with a nodata value of -999

ncols          3
nrows          3
xllcorner      0
yllcorner      0
cellsize       1
NODATA_value   -999
0 1 2
-999 4 5 
6 7 8

>>> import numpy as np
>>> ascii_file = "c:/temp/Ascii_3x3_1nodata.asc"
>>> an_array = np.mafromtxt(ascii_file, 'float', '#', None, 6, None, '-999')

>>> print an_array

[[0.0 1.0 2.0]
 [-- 4.0 5.0]  
 [6.0 7.0 8.0]]

>>>

वहां से यह केवल उन आंकड़ों को निर्धारित करने की बात है जो आप चाहते हैं

>>> print an_array.min()
0.0
>>> print an_array.max()
8.0
>>> print an_array.mean()
4.125
>>> 

शुक्रिया दान। मैं एक बार इसका प्रयास करूँगा। वहाँ एक वैकल्पिक तरीका है ... शायद खस्ता मॉड्यूल के बिना?
6

6

आप रेखापुंज डेटा आँकड़े चाहते हैं।
देखें कि आप पहले क्या कर रहे हैं (होमवर्क के लिए)।

तब आप एक अजगर खिड़की या एक स्क्रिप्ट का उपयोग कर सकते हैं ।

import arcpy
arcpy.CalculateStatistics_management("c:/data/image.tif", "4", "6", "0;255;21")

एक बार जब आप आँकड़ों की गणना कर लेते हैं, तो आप हमेशा रास्टर ऑब्जेक्ट प्रॉपर्टी के माध्यम से भी आँकड़ों तक पहुँच सकते हैं। उदा। r = arcpy.Raster ("c: /data/image.tif"), r.mean, r.minimum, r.maximum
blord-castillo

@ ब्लो-कैस्टिलो कूल! नहीं पता था कि टिप के लिए धन्यवाद :)
kaoscify 6

3
import sys

class Ascii_file(object):
    def __init__(self,file):
        self.raster_file = open(file, 'r') # Open the file
        self.max=sys.float_info.min
        self.min=sys.float_info.max
    def __minmax(self,value):
        if value>self.max:self.max=value
        if value<self.min:self.min=value
    def getMinMax(self):
        data = self.raster_file.readlines()
        data_values=data[6:]
        nodata=float(data[5].split()[1])
        for line in data_values:
            values=line.split(" ")
            for value in values:
                value=float(value)
                if value==nodata:continue
                else: self.__minmax(value)
        return self.min, self.max

if __name__=="__main__":
    myfile = Ascii_file('data.asc')
    print myfile.getMinMax()

यह उस तरह का है जो मैं पहले कोशिश कर रहा था, लेकिन जब मैं विभाजन विधि का उपयोग करता हूं तो मुझे त्रुटियाँ AttributeError: 'list' object has no attribute 'split'
मिलती रहती हैं

मुझे लगता है कि data = raster_file.readlines()[4:]जब यह सीमा निर्दिष्ट करने की बात आती है तो लाइन वास्तव में काम नहीं करती है। मैंने पिछली टिप्पणी में जो त्रुटि थी, उसे ठीक किया। यह num = data[7]3 पंक्ति में जोड़कर किया गया था। तब इसका उपयोग करके विभाजन किया values = num.split()गया था और अधिकतम / मिनट खोजने में सक्षम था, लेकिन केवल उस विशेष लाइन के लिए। मैं पूरे दस्तावेज़ से अधिकतम / मिनट कैसे प्राप्त कर सकता हूं?
kaoscify

ओह, मेरी गलती, "डेटा" एक सूची है, "लाइनें" स्ट्रिंग है। मैंने कोड संपादित कर लिया है ... मैंने इसे एक एस्क फ़ाइल के साथ परीक्षण किया। बस कॉपी और पेस्ट करें, इंडेंटेशन पर ध्यान दें।
पाब्लो

2
आप if check==Trueअपने न्यूनतम / अधिकतम मानों को प्रारंभ करके ब्लॉक को छोड़ सकते हैं। आप मिनटों को sys.float_info.max और अधिकतम sys.float_info.min पर आरंभ करना चाहते हैं।
सास इवेटिक

3
आपको sys.float_info.min, और min से sys.float_info.ax पर अधिकतम इनिशियलाइज़ करना होगा। कि आप अपने प्रारंभिक मिनट सबसे बड़ा संभव मूल्य हो जाएगा, और आप इसे तुलना किसी भी मूल्य छोटा हो जाएगा, और इस तरह नए मंत्री बन जाएगा। वही आपके अधिकतम मूल्य के साथ जाता है, यह सबसे छोटा संभव मूल्य होगा, और आपकी तुलना में कोई भी मूल्य बड़ा होगा, और इस प्रकार नया अधिकतम होगा।
सास इवेटिक

1

यदि आप सुन्न का उपयोग नहीं करना चाहते हैं (और आपको वास्तव में ऐसा करना चाहिए, यह इस प्रकार की चीज़ के लिए एकदम सही है), तो आपको निम्न की आवश्यकता होगी:

  • अपने maximumवैरिएबल को एक बहुत बड़ी ऋणात्मक संख्या पर आरम्भ करें और आपके minimumचर को एक बहुत बड़ी सकारात्मक संख्या में
  • प्रत्येक पंक्ति को स्ट्रिंग्स की सूची प्राप्त करने के लिए विभाजित करें और इसे तैरने की सूची में बदलने के लिए सूची समझ का उपयोग करें
  • अंत maximum = max(maximum, max(myfloatlist))में न्यूनतम मूल्य के लिए कुछ समान और एक समान का उपयोग करें ।

0

मैंने दूसरे दिन बस यही किया। मैंने उपयोग किया arcpy.RasterToNumPyArray, सुन्न सरणी को एक सूची में परिवर्तित किया , फिर मेरी सूची के माध्यम से पुनरावृत्त किया गया कि सूची और अधिकतम मानों को खोजने के लिए एक सूची के माध्यम से।

import arcpy
import numpy
myArray = arcpy.RasterToNumPyArray(r"D:\NED_93512417\NED_93512417_3DEM_RPRJ.TIF")
p = myArray.tolist()

max_elev = max([item for sublist in p for item in sublist])
min_elev = min([item for sublist in p for item in sublist])

नहीं है myArray.min()/ myArray.max()सरल / तेजी से?
माइक टी

1
@Chad, यदि आपके पास पहले से ही सुन्न सरणी है, तो एक सूची में बदलने की कोई आवश्यकता नहीं है, बस ऊपर दिए गए मेरे धागे में मिन (), अधिकतम () आदि कार्यों का उपयोग करें। जैसा कि आप भी ध्यान दें, अर्की तक कोई भी निहित उपयोग नहीं दर्शाया गया था।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.