পাইথন ব্যবহার করে কোনও ASCII রাস্টার ডেটাসেটে ন্যূনতম এবং সর্বাধিক মান নির্ধারণ করা হচ্ছে?


12

আমার কাছে ASCII ফর্ম্যাটে একটি রাস্টার ডেটাসেট রয়েছে। পাইথন ব্যবহার করে, আমার ডেটাসেটের অভ্যন্তর minএবং maxমানগুলি নির্ধারণ করতে হবে । আমাকে বলা হয়েছে যে শিরোনামের তথ্য কী, যাতে সারি / কলামের সংখ্যা, কক্ষের আকার এবং ইত্যাদি থাকে things

আপনি কি শিরোনামের তথ্যগুলি এড়িয়ে যেতে 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
আপনি কি ওপেন সোর্স বা ইএসআরআই স্ট্যাক ব্যবহার করছেন?
আন্ডার ডার্ক

উত্তর:


12

আপনি নিম্পী ব্যবহার করতে পারেন। নীচে উদাহরণ দেখুন। কোনও ন্যালি মাস্কেড অ্যারে কোনও ডেটা মানের জন্য অ্যাকাউন্টিং উত্পন্ন করতে পারে। মফ্র্যামটেক্সট এবং জেনফ্রমেক্সটেক্সের জন্য নির্লজ্জ সহায়তার বিষয়টি দেখুন

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

আপনি রাস্টার ডেটা পরিসংখ্যান চান।
আপনি প্রথমে গুইতে কী করছেন তা দেখুন (হোম ওয়ার্কের জন্য))

তারপরে আপনি পাইথন উইন্ডো বা স্ক্রিপ্ট ব্যবহার করতে পারেন ।

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

একবার আপনি পরিসংখ্যান গণনা করেন, আপনি সর্বদা রাস্টার অবজেক্ট সম্পত্তি দ্বারা পরিসংখ্যান অ্যাক্সেস করতে পারেন। যেমন r = আরকিপি.আরস্টার ("সি: /ডাটা / আইমেজ.টিফ"), আর.মেন, আর.মিনিমম, আর.ম্যাক্সিমিয়াম
ব্লর্ড-কাস্টিলো

@ ব্লর্ড-কাস্টিলো দুর্দান্ত! তা জানতাম না।
টিপটির

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]তৃতীয় লাইনে যুক্ত করে করা হয়েছিল । এরপরে এটি ব্যবহার করে বিভক্ত values = num.split()হয়েছিল এবং সর্বাধিক / মিনিট সন্ধান করতে সক্ষম হয়েছিল তবে কেবলমাত্র সেই নির্দিষ্ট লাইনের জন্য। আমি কীভাবে পুরো ডকুমেন্ট থেকে সর্বোচ্চ / মিনিট সন্ধান করতে পারি?
42

ওহ, আমার ভুল, "ডেটা" একটি তালিকা, "লাইনগুলি" স্ট্রিং। আমি কোডটি সম্পাদনা করেছি ... আমি এএসসি ফাইল দিয়ে এটি পরীক্ষা করেছি। খালি অনুলিপি করুন এবং আটকান
পাবলো

2
আপনি if check==Trueআপনার ন্যূনতম / সর্বাধিক মানগুলি শুরু করে ব্লকটি ফেলে দিতে পারেন । আপনি sys.float_info.max থেকে মিনিট এবং সর্বাধিক sys.float_info.min শুরু করতে চাইবেন।
সাসা আইভেটিক

3
আপনাকে সেকস.ফ্লোয়াট_ইনফো.মিন থেকে সর্বোচ্চ এবং মিনিট থেকে সিস.ফ্লোয়াট_ইনফো.ম্যাক্সের সূচনা করতে হবে। যে আপনি আপনার প্রাথমিক মিনিটটি সবচেয়ে সম্ভাব্য মান হবে এবং আপনি যে তুলনায় এটির তুলনা করেন তা কম হবে এবং এইভাবে নতুন মিনিটে পরিণত হবে। আপনার সর্বোচ্চ মানটি একই, এটি সম্ভবতমতম মান হবে এবং আপনি যেটির সাথে এটির তুলনা করেন তার মান আরও বড় হবে এবং এইভাবে নতুন সর্বোচ্চটি হবে।
সাসা আইভেটিক

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
@ চ্যাড, যদি আপনার কাছে ইতিমধ্যে অদ্ভুত অ্যারে থাকে তবে তালিকায় রূপান্তর করার দরকার নেই, উপরের আমার থ্রেডে কেবল কমপক্ষে (), সর্বোচ্চ () ইত্যাদি ফাংশন ব্যবহার করুন। আপনি যেমন নোট করেছেন, আরকিপিতে কোনও প্রচ্ছন্ন অ্যাক্সেস নির্দেশ করা হয়নি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.