एक csv फ़ाइल में एक NumPy सरणी को डंप करें


545

वहाँ एक CSP फ़ाइल में एक NumPy सरणी डंप करने का एक तरीका है? मेरे पास 2 डी न्यूम्पी सरणी है और इसे मानव-पठनीय प्रारूप में डंप करने की आवश्यकता है।

जवाबों:


866

numpy.savetxt टेक्स्ट फ़ाइल में एक सरणी सहेजता है।

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

2
क्या यह आयाम द्वारा सरणी के माध्यम से लूपिंग पर पसंद किया जाता है? मेरे ख्याल से।
एहतेश चौधरी

51
आप fmt कीवर्ड के साथ प्रत्येक आकृति का प्रारूप भी बदल सकते हैं। डिफ़ॉल्ट '% .18e' है, इसे पढ़ना कठिन हो सकता है, आप '% .3e' का उपयोग कर सकते हैं, इसलिए केवल 3 दशमलव दिखाए जाते हैं।
एंड्रिया ज़ोंका

3
एंड्रिया, हां मैंने% 10.5f का इस्तेमाल किया। यह बहुत सुविधाजनक था।
डेक्सटर

12
संख्यात्मक डेटा के लिए आपकी विधि अच्छी तरह से काम करती है, लेकिन यह numpy.arrayतार के लिए एक त्रुटि फेंकता है । क्या आप numpy.arrayस्ट्रिंग वाले ऑब्जेक्ट के लिए csv के रूप में सहेजने के लिए कोई विधि लिख सकते हैं ?
31बे इसाक

16
@ AsbeIsaac आप स्ट्रिंग को प्रारूप के रूप में अच्छी तरह से निर्दिष्ट कर सकते हैं: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
अच्छा नही। यह एक df बनाता है और कुछ नहीं के लिए अतिरिक्त मेमोरी का उपभोग करता है
टेक्स

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

6
संस्करण 1.5.0 के बाद से, np.tofile () मल्टी-लाइन आउटपुट की अनुमति देने के लिए एक वैकल्पिक पैरामीटर newline = '\ n' लेता है। docs.scipy.org/doc/numpy-1.13.0/reference/generated/…
केविन जे। ब्लैक

2
वास्तव में, np.savetext () न्यूलाइन तर्क प्रदान करता है, न कि np.tofile ()
eaydin

14

हेडर के साथ CSV फ़ाइलों के रूप में रिकॉर्ड एरेज़ लिखना थोड़ा और अधिक काम की आवश्यकता है।

यह उदाहरण पहली पंक्ति पर हेडर के साथ एक सीएसवी फ़ाइल पढ़ता है, फिर उसी फ़ाइल को लिखता है।

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())

यह वह जगह है जहाँ पांडा फिर से मदद करता है। आप कर सकते हैं: pd.DataFrame (आउट, कॉलम = ['col1', 'col2']), आदि
EFreak

9

जैसा कि पहले ही चर्चा की गई है, सरणी को सीएसवी फ़ाइल में डंप करने का सबसे अच्छा तरीका .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=",")

अपने मूल प्रारूप में डेटा संग्रहीत करने के लिए

संकुचित gz प्रारूप में डेटा की बचत

इसके अलावा, संपीड़ित प्रारूप savetxtमें डेटा संग्रहीत करने के लिए उपयोग किया जा सकता है .gzजो नेटवर्क पर डेटा स्थानांतरित करते समय उपयोगी हो सकता है।

हमें बस फ़ाइल के विस्तार को बदलने की आवश्यकता है .gzऔर सुन्न अपने आप सब कुछ का ख्याल रखेगा

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

आशा है ये मदद करेगा


1
fmt="%d"मैं के लिए क्या देख रहा था। धन्यवाद!
payne

5

मेरा मानना ​​है कि आप इसे इस प्रकार सरलता से पूरा कर सकते हैं:

  1. पांडस डेटाफ्रेम में Numpy सरणी में कनवर्ट करें
  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")

यहाँ 'a', numpy array का नाम है और 'file' एक फाइल में लिखने का वेरिएबल है।

यदि आप पंक्ति में लिखना चाहते हैं:

    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=';' और csv- फाइल में सेल इस तरह दिखेगा[[1, 2], [2, 4]]

तब आप इस तरह से अपनी सरणी को पुनर्स्थापित कर सकते हैं: your_array = np.array(ast.literal_eval(cell_string))


अच्छी तरह से है कि सचमुच एक खौफनाक सरणी का उपयोग करने के लिए सभी स्मृति बचत को नष्ट करने के लिए जा रहा है
PirateApp

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
यह बहुत सारी मेमोरी का उपयोग करता है । प्रत्येक पंक्ति और प्रारूप पर लूपिंग को प्राथमिकता दें और इसे लिखें।
रेमित्र

@remram यह आपके डेटा पर निर्भर करता है, लेकिन हाँ अगर यह बड़ा है तो यह बहुत सारी मेमोरी का उपयोग कर सकता है
ग्रेग

2

पायथन में हम csv फ़ाइलों में डेटा लिखने के लिए 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 कृपया केवल नए दृष्टिकोण जोड़ें, पहले से प्रकाशित सुझावों को न दोहराएं।
श्री टी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.