একটি এনএসপি ফাইলে একটি নম্পপি অ্যারে ফেলে দিন


545

কোনও এনএসপি ফাইলে নুমপি অ্যারে ফেলে দেওয়ার কোনও উপায় আছে কি? আমার কাছে একটি 2 ডি নম্পপি অ্যারে রয়েছে এবং এটি মানব-পঠনযোগ্য ফর্ম্যাটে ফেলে দিতে হবে।

উত্তর:


865

numpy.savetxt একটি পাঠ্য ফাইলে একটি অ্যারে সংরক্ষণ করে।

import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")

2
এই মাত্রা দ্বারা অ্যারের মাধ্যমে লুপিং বেশি পছন্দ? আমি তাই অনুমান করছি.
এহতেশ চৌধুরী

51
আপনি এফএমটি কীওয়ার্ডের সাহায্যে প্রতিটি চিত্রের বিন্যাসও পরিবর্তন করতে পারেন। ডিফল্টটি '% .18e' হয়, এটি পড়া শক্ত হয়, আপনি '% .3e' ব্যবহার করতে পারেন তাই কেবলমাত্র 3 দশমিক দেখানো হয়।
অ্যান্ড্রিয়া জোনকা

3
আন্দ্রে, হ্যাঁ আমি% 10.5f ব্যবহার করেছি। এটি বেশ সুবিধাজনক ছিল।
ডেক্সটার

12
আপনার পদ্ধতি সংখ্যাগত ডেটার জন্য ভাল কাজ করে, তবে এটি numpy.arrayস্ট্রিংগুলির জন্য একটি ত্রুটি নিক্ষেপ করে। numpy.arrayস্ট্রিংসযুক্ত কোনও সামগ্রীর জন্য আপনি সিএসভি হিসাবে সংরক্ষণের জন্য কোনও পদ্ধতি লিখে দিতে পারেন ?
আইজাক

16
@ ÉbeIsaac আপনি স্ট্রিং হিসাবে ফর্ম্যাটটিও নির্দিষ্ট করতে পারেন:fmt='%s'
লুইস

136

আপনি ব্যবহার করতে পারেন pandas। এটি কিছু অতিরিক্ত স্মৃতি গ্রহণ করে তাই এটি সর্বদা সম্ভব না, তবে এটি খুব দ্রুত এবং সহজেই ব্যবহারযোগ্য।

import pandas as pd 
pd.DataFrame(np_array).to_csv("path/to/file.csv")

আপনি যদি একটি শিরোনাম বা সূচক না চান, ব্যবহার করুন to_csv("/path/to/file.csv", header=None, index=None)


4
তবে এটি প্রথম সারিতে একটি কলাম সূচকও লিখবে।
আরএম-

5
@ আরএম- আপনি ব্যবহার করতে পারেনdf.to_csv("file_path.csv", header=None)
ম্যাক্সবেলেক

4
ভাল না. এটি একটি ডিএফ তৈরি করে এবং কোনও
টেক্স

20
মোহন মতো কাজ করেছে, এটি খুব দ্রুত - অতিরিক্ত মেমরির ব্যবহারের জন্য ট্রেড অফ। পরামিতি header=None, index=Noneশিরোনাম সারি এবং সূচক কলামটি সরিয়ে দেয়।
thepunitsingh

3
@DaveC: আপনি সেট করতে commentsশব্দ যুক্তি '', #দমন করা হবে।
মিলিণ্ড আর

45

tofile এটি করার জন্য একটি সুবিধাজনক ফাংশন:

import numpy as np
a = np.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
a.tofile('foo.csv',sep=',',format='%10.5f')

ম্যান পৃষ্ঠায় কিছু দরকারী নোট রয়েছে:

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

বিঃদ্রঃ. এই ফাংশনটি মাল্টি-লাইন সিএসভি ফাইল তৈরি করে না, এটি সমস্ত কিছু এক লাইনে সংরক্ষণ করে।


5
আমি যতদূর বলতে পারি এটি কোনও সিএসভি ফাইল তৈরি করে না, তবে সবকিছুকে একটি লাইনে ফেলে দেয়।
পিটার

@ পিটার, ভাল পয়েন্ট, ধন্যবাদ, আমি উত্তর আপডেট করেছি। আমার জন্য এটি সিএসভি ফর্ম্যাটে ঠিক আছে (যদিও এক লাইনে সীমাবদ্ধ)। এছাড়াও, এটি পরিষ্কার যে প্রশ্নকারীর উদ্দেশ্য "এটিকে মানব-পাঠযোগ্য বিন্যাসে ফেলে দেওয়া" - সুতরাং আমি উত্তরটি প্রাসঙ্গিক এবং দরকারী বলে মনে করি।
atomh33ls 10

6
সংস্করণ 1.5.0 থেকে, np.tofile () মাল্টি-লাইন আউটপুটটিকে অনুমতি দিতে lineচ্ছিক প্যারামিটার নতুন লাইন = '\ n' নেয় takes docs.scipy.org/doc/numpy-1.13.0/references/generated/…
কেভিন জে ব্ল্যাক

2
আসলে, np.savetext () নতুন লাইনের যুক্তি সরবরাহ করে, np.tofile () নয়
eaydin

14

শিরোনাম সহ সিএসভি ফাইল হিসাবে রেকর্ড অ্যারে লেখার জন্য আরও কিছুটা কাজের প্রয়োজন।

এই উদাহরণটি প্রথম লাইনে শিরোনাম সহ একটি সিএসভি ফাইল পড়ে, তারপরে একই ফাইলটি লিখে।

import numpy as np

# Write an example CSV file with headers on first line
with open('example.csv', 'w') as fp:
    fp.write('''\
col1,col2,col3
1,100.1,string1
2,222.2,second string
''')

# Read it as a Numpy record array
ar = np.recfromcsv('example.csv')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i4'), ('col2', '<f8'), ('col3', 'S13')])

# Write as a CSV file with headers on first line
with open('out.csv', 'w') as fp:
    fp.write(','.join(ar.dtype.names) + '\n')
    np.savetxt(fp, ar, '%s', ',')

নোট করুন যে এই উদাহরণটি কমা দিয়ে স্ট্রিং বিবেচনা করে না। অ-সংখ্যাসূচক ডেটার জন্য উদ্ধৃতি বিবেচনা করতে, csvপ্যাকেজটি ব্যবহার করুন :

import csv

with open('out2.csv', 'wb') as fp:
    writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(ar.dtype.names)
    writer.writerows(ar.tolist())

এখানেই পান্ডাস আবার সাহায্য করে। আপনি এটি করতে পারেন: পিডি.ডাটাফ্রেম (আউট, কলামগুলি [[কোল 1 ',' কল 2 ']), ইত্যাদি ইত্যাদি
এফ্রেইক

9

ইতিমধ্যে আলোচনা হিসাবে, অ্যারেটি CSV ফাইলে ফেলার সর্বোত্তম উপায় হ'ল ব্যবহার করা .savetxt(...) পদ্ধতি । তবে এটি সঠিকভাবে করার জন্য আমাদের কয়েকটি বিষয় জানতে হবে।

উদাহরণস্বরূপ, যদি আপনার সাথে একটি numpy অ্যারে আছে dtype = np.int32যেমন

   narr = np.array([[1,2],
                 [3,4],
                 [5,6]], dtype=np.int32)

এবং savetxtহিসাবে ব্যবহার করে সংরক্ষণ করতে চান

np.savetxt('values.csv', narr, delimiter=",")

এটি হিসাবে ভাসমান বিন্দু ঘনিষ্ঠ ফরম্যাটে তথ্য সংরক্ষণ করবে

1.000000000000000000e+00,2.000000000000000000e+00
3.000000000000000000e+00,4.000000000000000000e+00
5.000000000000000000e+00,6.000000000000000000e+00

আপনি একটি প্যারামিটার নামের বস্তু ব্যবহার করে বিন্যাস পরিবর্তন করতে হবে fmtযেমন

np.savetxt('values.csv', narr, fmt="%d", delimiter=",")

এটির মূল বিন্যাসে ডেটা সঞ্চয় করতে

সংকুচিত জিজেড ফর্ম্যাটে ডেটা সংরক্ষণ করা হচ্ছে

এছাড়াও, সংক্ষেপিত বিন্যাসে savetxtডেটা সংরক্ষণের জন্য ব্যবহার করা .gzযেতে পারে যা নেটওয়ার্কের মাধ্যমে ডেটা স্থানান্তর করার সময় কার্যকর হতে পারে।

আমাদের কেবল ফাইলের এক্সটেনশানটি পরিবর্তন করতে .gzহবে এবং নমপি সমস্ত কিছু স্বয়ংক্রিয়ভাবে যত্ন নেবে

np.savetxt('values.gz', narr, fmt="%d", delimiter=",")

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


1
fmt="%d"আমি যা খুঁজছেন হয়। ধন্যবাদ!
পেইন

5

আমি বিশ্বাস করি যে আপনি নীচের মত খুব সহজভাবে এটি সম্পাদন করতে পারেন:

  1. নিম্পি অ্যারেকে পান্ডাস ডেটা ফ্রেমে রূপান্তর করুন
  2. CSV হিসাবে সংরক্ষণ করুন

যেমন # 1:

    # Libraries to import
    import pandas as pd
    import nump as np

    #N x N numpy array (dimensions dont matter)
    corr_mat    #your numpy array
    my_df = pd.DataFrame(corr_mat)  #converting it to a pandas dataframe

যেমন # 2:

    #save as csv 
    my_df.to_csv('foo.csv', index=False)   # "foo" is the name you want to give
                                           # to csv file. Make sure to add ".csv"
                                           # after whatever name like in the code

4

আপনি যদি কলামে লিখতে চান:

    for x in np.nditer(a.T, order='C'): 
            file.write(str(x))
            file.write("\n")

এখানে 'ক' নামি অ্যারের নাম এবং 'ফাইল' একটি ফাইলে লেখার জন্য ভেরিয়েবল।

আপনি যদি সারিতে লিখতে চান:

    writer= csv.writer(file, delimiter=',')
    for x in np.nditer(a.T, order='C'): 
            row.append(str(x))
    writer.writerow(row)

2

আপনি যদি নিজের নাম্পার অ্যারে (উদাঃ your_array = np.array([[1,2],[3,4]])) কে একটি ঘরে সংরক্ষণ করতে চান তবে আপনি প্রথমে এটি রূপান্তর করতে পারেনyour_array.tolist()

তারপরে এটিকে একটি ঘরে সাধারণ পদ্ধতিতে সংরক্ষণ করুন delimiter=';' এবং এর সাথে সিএসভি-ফাইলে থাকা ঘরটি দেখতে পাবেন[[1, 2], [2, 4]]

তারপরে আপনি নিজের অ্যারেটি পুনরুদ্ধার করতে পারেন: your_array = np.array(ast.literal_eval(cell_string))


আচ্ছা, যা আক্ষরিক অর্থে অদ্ভুত অ্যারে ব্যবহারের জন্য সমস্ত মেমরি সঞ্চয়কে ধ্বংস করতে চলেছে
পাইরেটএপ

2

আপনি কোনও মডিউল ব্যবহার না করে খাঁটি অজগর দিয়ে এটি করতে পারেন।

# format as a block of csv text to do whatever you want
csv_rows = ["{},{}".format(i, j) for i, j in array]
csv_text = "\n".join(csv_rows)

# write it to a file
with open('file.csv', 'w') as f:
    f.write(csv_text)

1
এটি প্রচুর স্মৃতি ব্যবহার করে । প্রতিটি সারি এবং বিন্যাসের উপরে লুপিং পছন্দ করুন এবং এটি লিখুন।
রিমরাম

@ রেরাম এটি আপনার ডেটার উপর নির্ভর করে, তবে হ্যাঁ এটি বড় হলে এটি প্রচুর স্মৃতি ব্যবহার করতে পারে
গ্রেগ

2

পাইথনে আমরা সিএসভি ফাইলগুলিতে ডেটা লিখতে csv.writer () মডিউল ব্যবহার করি। এই মডিউলটি csv.reader () মডিউলটির অনুরূপ।

import csv

person = [['SN', 'Person', 'DOB'],
['1', 'John', '18/1/1997'],
['2', 'Marie','19/2/1998'],
['3', 'Simon','20/3/1999'],
['4', 'Erik', '21/4/2000'],
['5', 'Ana', '22/5/2001']]

csv.register_dialect('myDialect',
delimiter = '|',
quoting=csv.QUOTE_NONE,
skipinitialspace=True)

with open('dob.csv', 'w') as f:
    writer = csv.writer(f, dialect='myDialect')
    for row in person:
       writer.writerow(row)

f.close()

একটি ডিলিমিটার ক্ষেত্রগুলি পৃথক করতে ব্যবহৃত একটি স্ট্রিং। ডিফল্ট মান হ'ল কমা (,)।


এটি ইতিমধ্যে প্রস্তাবিত হয়েছে: stackoverflow.com/a/41009026/8881141 দয়া করে কেবলমাত্র নতুন পন্থা যুক্ত করুন, পূর্বে প্রকাশিত পরামর্শগুলি পুনরাবৃত্তি করবেন না।
মিঃ টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.