একটি পাঠ্য ফাইলে একটি বহুমাত্রিক অ্যারে কীভাবে লিখবেন?


115

অন্য একটি প্রশ্নে, অন্য ব্যবহারকারীরা যদি আমার যে সমস্যাটি ভুগছিল তার অ্যারে সরবরাহ করতে পারলে কিছু সহায়তা দিত। যাইহোক, আমি এমনকি একটি প্রাথমিক I / O কার্য, যেমন একটি ফাইলের জন্য অ্যারে লিখতে ব্যর্থ।

যে কোনও লুপের জন্য আমাকে 4x11x14 নাম্পার অ্যারে লিখতে হবে তা কী ব্যাখ্যা করতে পারে?

এই অ্যারেটিতে চারটি 11 x 14 অ্যারে রয়েছে, তাই অন্যের কাছে ফাইলটি পড়া আরও সহজ করার জন্য আমার এটি একটি দুর্দান্ত নিউলাইন দিয়ে ফর্ম্যাট করা উচিত।

সম্পাদনা : সুতরাং আমি চেষ্টা করেছি numpy.savetxt ফাংশন। আশ্চর্যজনকভাবে, এটি নিম্নলিখিত ত্রুটিটি দেয়:

TypeError: float argument required, not numpy.ndarray

আমি ধরে নিই যে ফাংশনটি বহুমাত্রিক অ্যারেগুলির সাথে কাজ করে না কারণ এটি? কোনও ফাইল যেমন আমি তাদের এক ফাইলের মধ্যে চাই?

উত্তর:


197

যদি আপনি এটিকে ডিস্কে লিখতে চান যাতে এটি একটি অদ্ভুত অ্যারে হিসাবে আবার পড়া সহজ হয়ে যায়, সন্ধান করুন numpy.save। এটি বাছাই করাও ঠিকঠাক কাজ করবে তবে বড় অ্যারেগুলির জন্য এটি কম দক্ষ (যা আপনার নয়, তাই হয় পুরোপুরি ঠিক আছে)।

আপনি যদি এটি মানুষের পাঠযোগ্য হতে চান তবে এটি দেখুন numpy.savetxt

সম্পাদনা: সুতরাং, দেখে মনে হচ্ছে savetxtএটি> 2 মাত্রা সহ অ্যারেগুলির পক্ষে দুর্দান্ত বিকল্প নয় ... তবে কেবল সবকিছুই এর সম্পূর্ণ উপসংহারে টানতে:

আমি ঠিক বুঝতে পেরেছি যে numpy.savetxt2 টিরও বেশি মাত্রা সহ ন্যাডেরেগুলিতে চোকগুলি ... এটি সম্ভবত ডিজাইনের মাধ্যমে, কারণ কোনও পাঠ্য ফাইলে অতিরিক্ত মাত্রা নির্দেশ করার মতো অন্তর্নিহিত কোনও সংজ্ঞা নেই।

যেমন এটি (একটি 2 ডি অ্যারে) ভাল কাজ করে

import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)

TypeError: float argument required, not numpy.ndarray3 ডি অ্যারের জন্য একই জিনিস ব্যর্থ হবে (বরং একটি তথ্যহীন ত্রুটি সহ ):

import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)

একটি কার্যপ্রণালী হ'ল 3 ডি (বা ততোধিক) অ্যারেটিকে 2 ডি স্লাইসে বিভক্ত করা। যেমন

x = np.arange(200).reshape((4,5,10))
with file('test.txt', 'w') as outfile:
    for slice_2d in x:
        np.savetxt(outfile, slice_2d)

যাইহোক, আমাদের লক্ষ্যটি হ'ল স্পষ্টভাবে মানব পাঠযোগ্য, যদিও এখনও সহজেই এটিকে আবার পড়তে পারা যায় numpy.loadtxt। অতএব, আমরা কিছুটা আরও ভার্বোজ হতে পারি, এবং মন্তব্য করা লাইনগুলি ব্যবহার করে স্লাইসগুলি পৃথক করতে পারি। ডিফল্টরূপে, numpy.loadtxtযে লাইনগুলি শুরু হয় তা উপেক্ষা করবে #(বা যে কোনও চরিত্র commentsকোয়ার্গ দ্বারা নির্দিষ্ট করা আছে )। (এটি দেখতে আসলে ভার্বোজের চেয়ে বেশি মনে হচ্ছে ...)

import numpy as np

# Generate some test data
data = np.arange(200).reshape((4,5,10))

# Write the array to disk
with open('test.txt', 'w') as outfile:
    # I'm writing a header here just for the sake of readability
    # Any line starting with "#" will be ignored by numpy.loadtxt
    outfile.write('# Array shape: {0}\n'.format(data.shape))

    # Iterating through a ndimensional array produces slices along
    # the last axis. This is equivalent to data[i,:,:] in this case
    for data_slice in data:

        # The formatting string indicates that I'm writing out
        # the values in left-justified columns 7 characters in width
        # with 2 decimal places.  
        np.savetxt(outfile, data_slice, fmt='%-7.2f')

        # Writing out a break to indicate different slices...
        outfile.write('# New slice\n')

এই ফলন:

# Array shape: (4, 5, 10)
0.00    1.00    2.00    3.00    4.00    5.00    6.00    7.00    8.00    9.00   
10.00   11.00   12.00   13.00   14.00   15.00   16.00   17.00   18.00   19.00  
20.00   21.00   22.00   23.00   24.00   25.00   26.00   27.00   28.00   29.00  
30.00   31.00   32.00   33.00   34.00   35.00   36.00   37.00   38.00   39.00  
40.00   41.00   42.00   43.00   44.00   45.00   46.00   47.00   48.00   49.00  
# New slice
50.00   51.00   52.00   53.00   54.00   55.00   56.00   57.00   58.00   59.00  
60.00   61.00   62.00   63.00   64.00   65.00   66.00   67.00   68.00   69.00  
70.00   71.00   72.00   73.00   74.00   75.00   76.00   77.00   78.00   79.00  
80.00   81.00   82.00   83.00   84.00   85.00   86.00   87.00   88.00   89.00  
90.00   91.00   92.00   93.00   94.00   95.00   96.00   97.00   98.00   99.00  
# New slice
100.00  101.00  102.00  103.00  104.00  105.00  106.00  107.00  108.00  109.00 
110.00  111.00  112.00  113.00  114.00  115.00  116.00  117.00  118.00  119.00 
120.00  121.00  122.00  123.00  124.00  125.00  126.00  127.00  128.00  129.00 
130.00  131.00  132.00  133.00  134.00  135.00  136.00  137.00  138.00  139.00 
140.00  141.00  142.00  143.00  144.00  145.00  146.00  147.00  148.00  149.00 
# New slice
150.00  151.00  152.00  153.00  154.00  155.00  156.00  157.00  158.00  159.00 
160.00  161.00  162.00  163.00  164.00  165.00  166.00  167.00  168.00  169.00 
170.00  171.00  172.00  173.00  174.00  175.00  176.00  177.00  178.00  179.00 
180.00  181.00  182.00  183.00  184.00  185.00  186.00  187.00  188.00  189.00 
190.00  191.00  192.00  193.00  194.00  195.00  196.00  197.00  198.00  199.00 
# New slice

এটির পিছনে পড়া খুব সহজ, যতক্ষণ না আমরা আসল অ্যারের আকার জানি know আমরা ঠিক করতে পারি numpy.loadtxt('test.txt').reshape((4,5,10))। উদাহরণ হিসাবে (আপনি এক লাইনে এটি করতে পারেন, আমি কেবল বিষয়গুলি স্পষ্ট করার জন্য ভারবজ করছি):

# Read the array from disk
new_data = np.loadtxt('test.txt')

# Note that this returned a 2D array!
print new_data.shape

# However, going back to 3D is easy if we know the 
# original shape of the array
new_data = new_data.reshape((4,5,10))

# Just to check that they're the same...
assert np.all(new_data == data)


2
এই সমস্যার এখানে এখন আরও সহজ সমাধান রয়েছে: আপনারএসটিআরএ = এনপি.আররে ([স্ট্রিম (ভাল) আপনার মুলডেরায় ভ্যালারের জন্য]], টাইপ = 'স্ট্রিং'); np.savetxt ('YourTextFile.txt', yourStrArray, fmt = '% s')
গ্রেগ ক্রমিদা

@ গ্রেগক্রমিদা এবং আপনি কীভাবে অ্যারেটি পুনরুদ্ধার করবেন?
অ্যাস্ট্রোজুয়ানলু

@ জুয়ানলু 1001: আমি জানি যে numpy.loadtxt (...) একটি টাইপ যুক্তিও গ্রহণ করে, যা এনপি.স্ট্রিং_তে সেট করা যেতে পারে। আমি একটি শট দিতে হবে, প্রথম এবং formost। স্ট্রিং থেকে অ্যারে পার্স করার জন্য একটি নম্পি.ফর্মস্ট্রিং (...) রয়েছে is
গ্রেগ ক্রমিদা

আরে আমার যদি একটি চিত্র অ্যারে সঞ্চয় করা দরকার? চিত্রটির আকারটি যদি 512 x 512 বলে দেওয়া হয় তবে আমরা কীভাবে এটির আকার পরিবর্তন করব?
অম্বিকা সাক্সেনা

31

এটি আপনার প্রয়োজনীয়তাগুলি পূরণ করে কিনা তা আমি নিশ্চিত নই, আপনি যদি মনে করেন যে আপনি ফাইলটি লোকদের দ্বারা পঠনযোগ্য করে তুলতে আগ্রহী তবে এটি যদি প্রাথমিক উদ্বেগ না হয় তবে কেবল pickleএটি।

এটি সংরক্ষণ করতে:

import pickle

my_data = {'a': [1, 2.0, 3, 4+6j],
           'b': ('string', u'Unicode string'),
           'c': None}
output = open('data.pkl', 'wb')
pickle.dump(my_data, output)
output.close()

এটি আবার পড়তে:

import pprint, pickle

pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

pkl_file.close()

pprintঅভিধান মুদ্রণের জন্য আপনার প্রয়োজন হতে পারে না ।
zay

11

আপনার যদি মানব-পঠনযোগ্য আউটপুট প্রয়োজন না হয় তবে অন্য একটি বিকল্প আপনি চেষ্টা করতে পারেন সেটি হ'ল ম্যাটল্যাব .matফাইল হিসাবে অ্যারে সংরক্ষণ করা , যা কাঠামোগত অ্যারে। আমি ম্যাটল্যাবকে ঘৃণা করি, তবে আমি উভয়ই .matখুব কম লাইনেই লিখতে এবং পড়তে পারি তা সুবিধাজনক।

জো Kington এর উত্তর থেকে ভিন্ন, সুবিধার যে তুমি ডেটার মূল আকৃতি জানা প্রয়োজন না মধ্যে .mat, মধ্যে পড়া উপর পুনর্নির্মাণ করার কোন প্রয়োজন ফাইল অর্থাত। এবং ব্যবহার অসদৃশ pickle, একটি .matফাইল ম্যাটল্যাব দ্বারা পড়া যায়, এবং সম্ভবত কিছু অন্যান্য প্রোগ্রাম / ভাষাও।

এখানে একটি উদাহরণ:

import numpy as np
import scipy.io

# Some test data
x = np.arange(200).reshape((4,5,10))

# Specify the filename of the .mat file
matfile = 'test_mat.mat'

# Write the array to the mat file. For this to work, the array must be the value
# corresponding to a key name of your choice in a dictionary
scipy.io.savemat(matfile, mdict={'out': x}, oned_as='row')

# For the above line, I specified the kwarg oned_as since python (2.7 with 
# numpy 1.6.1) throws a FutureWarning.  Here, this isn't really necessary 
# since oned_as is a kwarg for dealing with 1-D arrays.

# Now load in the data from the .mat that was just saved
matdata = scipy.io.loadmat(matfile)

# And just to check if the data is the same:
assert np.all(x == matdata['out'])

অ্যারে .matফাইলটিতে অ্যারের নাম থাকা কীটি যদি আপনি ভুলে যান তবে আপনি সর্বদা এটি করতে পারেন:

print matdata.keys()

এবং অবশ্যই আপনি আরও অনেক কী ব্যবহার করে অনেক অ্যারে সঞ্চয় করতে পারেন।

সুতরাং হ্যাঁ - এটি আপনার চোখ দিয়ে পঠনযোগ্য হবে না, তবে ডেটা লিখতে এবং পড়তে কেবল 2 টি লাইন লাগে, যা আমি মনে করি এটি একটি উপযুক্ত বাণিজ্য।

Scipy.io.savemat এবং scipy.io.loadmat এবং এই টিউটোরিয়াল পৃষ্ঠাটির জন্য ডকগুলি একবার দেখুন : scipy.io ফাইল IO টিউটোরিয়াল


9

ndarray.tofile() কাজ করা উচিত

যেমন যদি আপনার অ্যারে বলা হয় a:

a.tofile('yourfile.txt',sep=" ",format="%s")

যদিও নতুন লাইনের ফর্ম্যাটিং পাবেন তা নিশ্চিত নন।

সম্পাদনা করুন (ক্রেডিট কেভিন জে ব্ল্যাকের মন্তব্য এখানে ):

সংস্করণ 1.5.0 থেকে, বহু-লাইন আউটপুট অনুমোদনের জন্য np.tofile()একটি alচ্ছিক প্যারামিটার লাগে newline='\n'https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.savetxt.html


তবে টেক্সটফাইল থেকে মূল অ্যারে তৈরি করার কোনও উপায় আছে কি?
আহসান আলম সোজিব

দেখতে @AhashanAlamSojib stackoverflow.com/questions/3518778/...
atomh33ls

tofileনেই newline='\n'
নিকো শ্ল্যামার

4

এটি করার জন্য বিশেষ গ্রন্থাগার রয়েছে। (অজগর জন্য প্লাস মোড়ক)

আশাকরি এটা সাহায্য করবে


1

আপনি কেবল তিনটি নেস্টেড লুপগুলিতে অ্যারেটি অতিক্রম করতে পারেন এবং সেগুলি আপনার ফাইলে মান লিখতে পারেন। পড়ার জন্য, আপনি কেবল একই সঠিক লুপ নির্মাণ ব্যবহার করেন। আপনার অ্যারেগুলি আবার সঠিকভাবে পূরণ করার জন্য আপনি সঠিক ক্রমে মানগুলি পাবেন।


0

একটি সরল ফাইল নাম.ওরাইট () অপারেশন ব্যবহার করে আমার এটি করার একটি উপায় আছে। এটি আমার পক্ষে ভাল কাজ করে তবে আমি 00 1500 ডেটা উপাদান থাকা অ্যারেগুলিকে নিয়ে কাজ করছি।

আমার কাছে কেবল ফাইলটির মধ্য দিয়ে লুপগুলি পুনরাবৃত্তি করতে হবে এবং সিএসভি স্টাইল আউটপুটটিতে আউটপুট গন্তব্য লাইন বাই লাইনে লিখতে হবে।

import numpy as np

trial = np.genfromtxt("/extension/file.txt", dtype = str, delimiter = ",")

with open("/extension/file.txt", "w") as f:
    for x in xrange(len(trial[:,1])):
        for y in range(num_of_columns):
            if y < num_of_columns-2:
                f.write(trial[x][y] + ",")
            elif y == num_of_columns-1:
                f.write(trial[x][y])
        f.write("\n")

যদি এবং এলিফ স্টেটমেন্টটি ডেটা উপাদানগুলির মধ্যে কমা যোগ করতে ব্যবহৃত হয়। যে কারণেই হোক না কেন, এনডি অ্যারে হিসাবে ফাইলটি পড়ার সময় এগুলি ছিটকে যায়। আমার লক্ষ্য ছিল ফাইলটি সিএসভি হিসাবে আউটপুট করা, সুতরাং এই পদ্ধতিটি এটি পরিচালনা করতে সহায়তা করে।

আশাকরি এটা সাহায্য করবে!


0

এই ক্ষেত্রে আচার সেরা is ধরুন আপনি নামের এক ndarray আছে x_train। আপনি এটিকে একটি ফাইলে ফেলে দিতে পারেন এবং নীচের কমান্ডটি ব্যবহার করে এটিকে ফিরতে পারেন:

import pickle

###Load into file
with open("myfile.pkl","wb") as f:
    pickle.dump(x_train,f)

###Extract from file
with open("myfile.pkl","rb") as f:
    x_temp = pickle.load(f)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.