Numpy.array () ডেটা সঠিকভাবে সংরক্ষণ এবং লোড করবেন কীভাবে?


107

আমি অবাক হই, কীভাবে numpy.arrayডেটা সংরক্ষণ এবং লোড করা যায় । বর্তমানে আমি numpy.savetxt()পদ্ধতিটি ব্যবহার করছি । উদাহরণস্বরূপ, যদি আমি কোনও অ্যারে পাই markers, যা দেখতে এটির মতো দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

আমি এটি ব্যবহার করে এটি সংরক্ষণ করার চেষ্টা করি:

numpy.savetxt('markers.txt', markers)

অন্যান্য স্ক্রিপ্টে আমি আগের সংরক্ষিত ফাইলটি খোলার চেষ্টা করি:

markers = np.fromfile("markers.txt")

আর এটাই আমি পাই ...

এখানে চিত্র বর্ণনা লিখুন

সংরক্ষিত ডেটা প্রথমে এরকম দেখাচ্ছে:

0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00

তবে আমি যখন একই পদ্ধতি ব্যবহার করে কেবল লোড হওয়া ডেটা সংরক্ষণ করি। numpy.savetxt()এটি দেখতে এটির মতো দেখাচ্ছে:

1.398043286095131769e-76
1.398043286095288860e-76
1.396426376485745879e-76
1.398043286055061908e-76
1.398043286095288860e-76
1.182950697433698368e-76
1.398043275797188953e-76
1.398043286095288860e-76
1.210894289234927752e-99
1.398040649781712473e-76

আমি কি ভুল করছি? PS আমি অন্য কোন "ব্যাকস্টেজ" অপারেশন করি না। কেবল সঞ্চয় এবং লোড হচ্ছে, এবং এটিই আমি পাই। তুমাকে অগ্রিম ধন্যবাদ.


টেক্সট ফাইলের আউটপুট কি? কেন শুধু একটি সিএসভি ফাইল লিখবেন না?

4
আপনার কি মানব-পঠনযোগ্য পাঠ্য ফাইল হিসাবে সংরক্ষণ এবং লোড করা দরকার? আপনি np.save()এবং ব্যবহার করে বাইনারি ফাইলগুলি সংরক্ষণ / লোড করলে এটি দ্রুত হবে (এবং ফাইলগুলি আরও কমপ্যাক্ট হবে) np.load()
ali_m

আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ। এটা সাহায্য করেছিল. যাইহোক, আপনি কী এটি কেন তা ব্যাখ্যা করতে পারেন এবং যদি * .txt ফর্ম্যাটে ডেটা সংরক্ষণের অনুমতি দেওয়া এবং মাথা ব্যাথা ছাড়াই লোড করার কোনও উপায় থাকে? উদাহরণস্বরূপ, যখন কেউ মতলব, জাভা বা অন্যান্য সরঞ্জাম / ভাষা নিয়ে কাজ করতে চায়।
ব্লুভক্সেল

4
এমএটিএলবিতে / থেকে অ্যারে পাস করতে আপনি scipy.io.savematএবং ব্যবহার করতে পারেন scipy.io.loadmat
ali_m

4
ডিফল্ট fromfileহ'ল বাইনারি হিসাবে ডেটা পড়া read loadtxtসঙ্গে সঠিক জুটি হয় savetxt। ফাংশন ডকুমেন্টেশন দেখুন।
hpaulj

উত্তর:


150

আমি এটি করতে সবচেয়ে নির্ভরযোগ্য উপায়টি হ'ল ব্যবহার করা np.savetxt করা np.loadtxtএবং এটি নয় np.fromfileযা দিয়ে লেখা বাইনারি ফাইলগুলির সাথে আরও উপযুক্ত tofilenp.fromfileএবং np.tofileপদ্ধতি লিখে যেহেতু বাইনারি ফাইল পড়া np.savetxtএকটি টেক্সট ফাইল লিখেছেন। সুতরাং, উদাহরণস্বরূপ:

In [1]: a = np.array([1, 2, 3, 4])
In [2]: np.savetxt('test1.txt', a, fmt='%d')
In [3]: b = np.loadtxt('test1.txt', dtype=int)
In [4]: a == b
Out[4]: array([ True,  True,  True,  True], dtype=bool)

বা:

In [5]: a.tofile('test2.dat')
In [6]: c = np.fromfile('test2.dat', dtype=int)
In [7]: c == a
Out[7]: array([ True,  True,  True,  True], dtype=bool)

আমি পূর্বের পদ্ধতিটি ধীরে ধীরে ধীরে ধীরে হলেও বড় ফাইলগুলি তৈরি করে (কখনও কখনও) ব্যবহার করি: বাইনারি ফর্ম্যাটটি প্ল্যাটফর্ম নির্ভর হতে পারে (উদাহরণস্বরূপ, ফাইল ফর্ম্যাটটি আপনার সিস্টেমের শেষের উপর নির্ভর করে)।

একটা হল প্ল্যাটফর্ম স্বাধীন NumPy অ্যারে, যা সংরক্ষণ করা যাবে এবং পড়তে সঙ্গে জন্য বিন্যাস np.saveএবং np.load:

In  [8]: np.save('test3.npy', a)    # .npy extension is added if not given
In  [9]: d = np.load('test3.npy')
In [10]: a == d
Out[10]: array([ True,  True,  True,  True], dtype=bool)

48
.npyফাইল (যেমন দ্বারা উত্পন্ন np.save()) হয় প্ল্যাটফর্ম-স্বাধীন, এবং আরও কম্প্যাক্ট হতে হবে এবং দ্রুত পাঠ্য ফাইল চেয়ে তৈরি করুন।
ali_m

4
এছাড়াও np.savezযদি আপনি আউটপুট সঙ্কুচিত করতে চান।
তেগনে

4
@tegan np.savezবেশ কয়েকটি অ্যারে সঙ্কুচিতভাবে সংরক্ষণ np.savez_compressedকরে - সেগুলি সংকুচিত করবে - np.save_compressedএখনও কিছুই নেই। দেখুন docs.scipy.org/doc/numpy-1.15.1/reference/routines.io.html
ব্রায়ান বার্নস

4
ধন্যবাদ xnx আমার একই সমস্যাটি ছিল (dtype float সহ) np.savetxt ব্যবহার করে এনপি.লোডটেক্সট এর সমাধান করেছে
যোগেশ

আমি 2GB এর চেয়েও বেশি আচার সংরক্ষণের ডেটা দিয়েছি। X.x ধন্যবাদ a.tofile এবং np.fromfile ব্যবহার করে সমস্যার সমাধান হয়েছে।
Azr

49
np.save('data.npy', num_arr) # save
new_num_arr = np.load('data.npy') # load

4
ব্যবহার করে কোন সমস্যা আছে pickle?
চার্লি পার্কার

উদাহরণস্বরূপ, যাতে আমরা x = db["x"]অনুসরণ করে ডেটা লোড করতে পারি y = db["y"]?
চার্লি পার্কার

আমি এটি চেষ্টা করার পরে আমার অ্যারে খালি ফিরে আসে। উরগ।
কিথ

@ কিথ, আপনি নিজের নাম্পার অ্যারে বাঁচানোর আগে কি কেবল মুদ্রণের চেষ্টা করেছিলেন?
শেরজোদ

@Sherzod আমি শুধু ব্যবহার করছিলেন array.shapeএবং পেয়ে ()ফিরে।
কিথ

3

np.fromfile()একটি sep=কীওয়ার্ড যুক্তি রয়েছে:

ফাইল যদি পাঠ্য ফাইল হয় তবে আইটেমগুলির মধ্যে পৃথককারী। খালি ("") বিভাজক অর্থ ফাইলটিকে বাইনারি হিসাবে ধরা উচিত। পৃথককারী স্পেস ("") শূন্য বা আরও বেশি সাদা বর্ণের অক্ষরের সাথে মেলে। কেবলমাত্র ফাঁকা জায়গাগুলির সাথে পৃথককারীকে অবশ্যই কমপক্ষে একটি সাদা স্থানের সাথে মেলে।

ডিফল্ট মানটির sep=""অর্থ np.fromfile()এটি একটি স্পেস-বিভাজিত পাঠ্য ফাইলের চেয়ে বাইনারি ফাইল হিসাবে পড়ার চেষ্টা করে, তাই আপনি ননজেস মানগুলি ফিরে পাবেন। আপনি যদি ব্যবহার করেন তবে np.fromfile('markers.txt', sep=" ")আপনি যে ফলাফলটি সন্ধান করছেন তা পেয়ে যাবেন।

তবে অন্যরা যেমন উল্লেখ করেছে, np.loadtxt()পাঠ্য ফাইলগুলিকে নম্পী অ্যারে রূপান্তর করার পক্ষে পছন্দনীয় উপায় এবং ফাইলটি যদি মানব-পঠনযোগ্য না হয় তবে সাধারণত তার পরিবর্তে বাইনারি ফর্ম্যাটগুলি ব্যবহার করা ভাল (যেমন np.load()/ np.save())।


ব্যবহার করে কোন সমস্যা আছে pickle?
চার্লি পার্কার

1

একটি সংক্ষিপ্ত উত্তরের জন্য আপনার ব্যবহার করা উচিত np.saveএবং np.load। এর সুবিধাগুলি হ'ল এগুলি নপি লাইব্রেরির বিকাশকারীদের দ্বারা তৈরি করা হয়েছে এবং তারা ইতিমধ্যে কাজ করে (প্লাস সম্ভবত ইতিমধ্যে সুন্দরভাবে অনুকূলিত হয়েছে) উদাহরণস্বরূপ

import numpy as np
from pathlib import Path

path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)

lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2

np.save(path/'x', x)
np.save(path/'y', y)

x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')

print(x is x_loaded) # False
print(x == x_loaded) # [[ True  True  True  True  True]]

প্রসারিত উত্তর:

শেষ পর্যন্ত এটি আপনার প্রয়োজনের উপর নির্ভর করে কারণ আপনি এটিকে মানব পাঠযোগ্য ফর্ম্যাটও সংরক্ষণ করতে পারেন (এই ফাইলটি একটি সিএমভি ফাইলে একটি নম্পপি অ্যারে দেখুন ) বা আপনার লাইব্রেরির সাথেও যদি আপনার ফাইলগুলি অত্যন্ত বড় হয় ( ন্যাপি অ্যারেগুলি সংরক্ষণের সর্বোত্তম উপায়টি দেখুন) বর্ধিত আলোচনার জন্য ডিস্কে )।

যাইহোক, (যেহেতু আপনি আপনার প্রশ্নের "সঠিকভাবে" শব্দটি ব্যবহার করেন সেহেতু একটি সম্প্রসারণ করা) আমি এখনও মনে করি বাক্সের বাইরে নামি ফাংশনটি ব্যবহার করে (এবং সর্বাধিক কোড!) সম্ভবত বেশিরভাগ ব্যবহারকারীর প্রয়োজন মেটাবে। সর্বাধিক গুরুত্বপূর্ণ কারণ এটি ইতিমধ্যে কাজ করে । অন্য যে কোনও কারণে অন্য কিছু ব্যবহার করার চেষ্টা করা আপনাকে অপ্রত্যাশিতভাবে দীর্ঘ খরগোশের গর্তে নিয়ে যেতে পারে কেন এটি কাজ করে না তা নির্ধারণ করতে এবং এটি কাজ করতে বাধ্য করে।

উদাহরণস্বরূপ এটি আচার দিয়ে সংরক্ষণ করার চেষ্টা করুন Take আমি চেষ্টা করেছি কেবল মজা করার জন্য এবং কমপক্ষে 30 মিনিট সময় লেগেছিল বুঝতে পেরেছিলাম যে আচার আমার জিনিসগুলি সংরক্ষণ করবে না যদি না আমি ফাইলটি বাইট মোডে না খুলি এবং না পড়ি wb। গুগল করতে সময় লাগল, জিনিস চেষ্টা করুন, ত্রুটির বার্তাটি বুঝতে পারেন ইত্যাদি ... ছোট বিবরণ তবে সত্য যে এটি ইতিমধ্যে আমাকে একটি ফাইল জটিল জিনিস অপ্রত্যাশিত উপায়ে খোলার প্রয়োজন ছিল। এটি যুক্ত করার জন্য আমাকে এটি পুনরায় পড়তে হবে (কোন বিটিডব্লিউ বিভ্রান্তিকর) এর মধ্যে একটি, এ +, ডাব্লু, ডাব্লু +, এবং আর + অন্তর্নির্মিত খোলা ফাংশনটির মধ্যে পার্থক্য?

সুতরাং যদি কোনও ইন্টারফেস থাকে যা আপনার চাহিদা পূরণ করে তবে এটি ব্যবহার করুন যদি না আপনার ( খুব ) ভাল কারণ থাকে (যেমন মাতলাবের সাথে সামঞ্জস্যতা বা কোনও কারণে আপনার ফাইলটি পড়তে চান এবং পাইথনে মুদ্রণ করা সত্যিই আপনার প্রয়োজনগুলি পূরণ করে না, যা প্রশ্নবিদ্ধ হতে পারে)। তদুপরি, আপনার যদি এটি অপ্টিমাইজ করা প্রয়োজন হয় তবে আপনি পরে লাইনটি খুঁজে বের করতে পারবেন (একটি সাধারণ নিম্পক ফাইল খোলার মতো অব্যবহৃত জিনিসগুলি ডিবাগ করার জন্য যুগে যুগে কাটানোর চেয়ে)।

সুতরাং ইন্টারফেস / নম্পি সরবরাহ ব্যবহার করুন । এটি নিখুঁত নাও হতে পারে এটি সম্ভবত সবচেয়ে সূক্ষ্ম, বিশেষত এমন একটি লাইব্রেরির জন্য যা প্রায় দীর্ঘকালীন।

আমি ইতিমধ্যে বেশ কিছু উপায়ে নিম্পির সাথে ডেটা সংরক্ষণ এবং লোড করার জন্য ব্যয় করেছি সুতরাং এটির সাথে মজা করুন, আশা করি এটি সাহায্য করবে!

import numpy as np
import pickle
from pathlib import Path

path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)

lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2

# using save (to npy), savez (to npz)
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
    pickle.dump(obj={'x':x, 'y':y}, file=db_file)

## using loading npy, npz files
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
    db_pkl = pickle.load(db_file)

print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')

আমি যা শিখেছি সে সম্পর্কে কিছু মন্তব্য:

  • np.saveযেমনটি প্রত্যাশিত, এটি ইতিমধ্যে এটি ভালভাবে সংকুচিত করে ( https://stackoverflow.com/a/55750128/1601580 দেখুন ), কোনও ফাইল খোলার ছাড়াই বাক্সটির বাইরে কাজ করে। পরিষ্কার। সহজ। দক্ষ. এটা ব্যবহার করো.
  • np.savezএকটি সঙ্কুচিত বিন্যাস ( ডক্স দেখুন ) ব্যবহার করে Save several arrays into a single file in uncompressed .npz format.আপনি যদি এটি ব্যবহার করার সিদ্ধান্ত নেন (আপনি আদর্শ সমাধান থেকে দূরে যাওয়ার পরামর্শ দিয়েছিলেন যাতে বাগগুলি প্রত্যাশা করা হয়!) আপনি আবিষ্কার করতে পারেন যে আপনি এটি সংরক্ষণ করতে যুক্তির নাম ব্যবহার করতে হবে, যদি না আপনি চান ডিফল্ট নাম ব্যবহার করুন। সুতরাং যদি এটি ইতিমধ্যে কাজ করে তবে এটি ব্যবহার করবেন না (বা কোনও কাজ এটি ব্যবহার করে!)
  • পিকলও নির্বিচারে কোড প্রয়োগের জন্য অনুমতি দেয়। কিছু লোক সুরক্ষার কারণে এটি ব্যবহার করতে নাও চাইবে।
  • মানব পাঠযোগ্য ফাইলগুলি বানানো ব্যয়বহুল etc. সম্ভবত এটির পক্ষে এটি উপযুক্ত নয়।
  • hdf5বড় ফাইলগুলির জন্য কিছু বলা আছে । কুল! https://stackoverflow.com/a/9619713/1601580

নোট করুন এটি একটি সম্পূর্ণ উত্তর নয়। তবে অন্যান্য সংস্থানগুলির জন্য এটি পরীক্ষা করুন:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.