اذهب إلى المحتوى

السؤال

نشر

 

هل هناك طريقة لتفريغ مصفوفة NumPy في ملف CSV؟ لدي مصفوفة NumPy  ثنائة الأبعاد وأحتاج إلى حفظها بتنسيق يمكن للبشر قراءته مثل ملفات CSV.

كيف أقوم بهذا الأمر؟ علمًا أن المصفوفة كبيرة بعض الشيء . هل يمكن أن أستعمل مكتبة Numpy فقط في هذه المهمة أم يجب أن أستعمل مكتبات أخرى مثل Pandas؟

Recommended Posts

  • 0
نشر

يمكن استخدام الوحدة numpy.savetxt لعمل المطلوب و حفظ المصفوفة في ملف CSV:

import numpy

a = numpy.asarray([ [1,2,3], [1,2,3], [1,2,3] ])

# تحديد اسم الملف و الفاصل بين البيانات
numpy.savetxt("file.csv", a, delimiter=",")

ويمكن باستعمال panda:

import pandas as pd 

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

أو الوحدة 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')

 

  • 0
نشر

يمكنك استخدام savetxt وستعمل بشكل سليم ولكن إذا كان هناك بعض المصفوفات بالنمط int32 ربما لن يتم حفظ المصفوفة في الملف بشكل صحيح والنمط السابق بل ربما يتم تغيير النمط ولن تكون قابلة للقراءة لذلك نحتاج لاستخدام المعامل fmt كالتالي

np.savetxt('values.csv', narr, fmt="%d", delimiter=",")
#integer تعني أن يكون من نوع %d لاحظ ال 

وإذا كانت المصفوفة كبيرة نوعاً ما يمكنك استخدام الصيغة gz وهي تجعل الملف مضغوط عن طريق تغيير صيغة الملف فقط كالتالي

#بدلاً من 

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

#استخدم

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

 

  • 0
نشر

كتابة المصفوفات كملفات CSV ذات الرؤوس تتطلب مزيدًا من العمل.

هذا المثال يقرأ من ملف CSV ( example.csv) ويكتب محتوياته إلى ملف CSV آخر ( out.csv).

import numpy as np

# كتابة ملف
# example.csv
# مع رؤوس في السطر الأول
with open('example.csv', 'w') as fp:
    fp.write('''\
col1,col2,col3
1,100.1,string1
2,222.2,second string
''')

# قراءة الملف كمصفوفة
# Numpy
ar = np.recfromcsv('example.csv', encoding='ascii')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i8'), ('col2', '<f8'), ('col3', '<U13')])

# كتابته كملف
# CSV
# مع الرؤوس في السطر الأول
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', 'w', newline='') as fp:
    writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(ar.dtype.names)
    writer.writerows(ar.tolist())

 

  • 2
نشر

هناك عدة طرق للقيام بذلك، أولها استخدام باندا:

import pandas as pd
import numpy as np
# إنشاءمصفوفة
a = np.arange(3,4).reshape(-1,2)
# طباعة المصفوفة
print(a)
# تحويل المصفوفة إلى DataFrame
df = pd.DataFrame(a)
#CSV حفظ الداتافريم كملف 
df.to_csv("data1.csv", index=False) #يفضل إلغاء تخزين عمود الفهرس لأنه قد يسبب لك مشاكل عند إعادة تحميل الملف

الطريقة الثانية هي استخدام numpy_array.tofile():

import numpy as np
# إنشاء مصفوفة
a = np.arange(3,4)
# عرض المصفوفة
print(a)
#tofile() استخدام الطريقة 
#',' يجب أن تستخدم الفاصلة 
# إنشاء الملف
a.tofile('data2.csv', sep = ',')

استخدام numpy.savetext():

"""
numpy.savetxt(fname, arr, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
"""
import numpy as np
# إنشاء مصفوفة
arr = np.array([[11, 16, 3],
				[1, 0, 8]])
#CSV حفظ المصفوفة في ملف 
np.savetxt("a.csv", arr,
			delimiter = ",")

لكن هنا سيتم تخزين البيانات في تنسيق أسي ك float مثل 2.000000000000000000e+00  لذا يجب عليك تغيير ال formatting باستخدام الوسيط fmt كما يلي:

np.savetxt('a.csv', arr, fmt="%d", delimiter=",")

طبعاً delimiter هو سلسلة أو حرف لاستخدامه كفاصل عنصر. و newline سلسلة أو حرف لاستخدامه كفاصل أسطر. و header تكتب سلسلة في بداية ملف txt أي ترويسة. أما footer فتكتب سلسلة في نهاية الملف (ذيل). و fmt افتراضياً تكون %.18e أي بالتنسيق الأسي. أما arr فهي مصفوفة أحادية أو ثنائية البعد حصراً. مثال آخر:

import numpy as np
arr = np.array([6, 1, 4, 2, 18, 9, 3, 4, 2, 8, 11])
np.savetxt('array.csv', [arr], delimiter=',', fmt='%d')
# ستخزن بالشكل التالي
# 6,1,4,2,18,9,3,4,2,8,11

مررنا المحدد "،" لجعله بتنسيق csv. تم قمنا بتمرير نوع التنسيق أيضاً كـ "٪ d" ، أي تخزين العناصر كأعداد صحيحة. وكما أشرت فإنه بشكل افتراضي، سيتم تخزين الأرقام بتنسيق عائم flotting point. وللتنويه أيضاً، إذا لم تقم  بإحاطة مصفوفة numpy ب [] أي تحويلها إلى قائمة أثناء تمريرها إلى numpy.savetxt () فقد لا يعمل محدد الفاصلة، وسيستخدم "\ n" كمحدد افتراضي. لذا يفضل إحاطتها. مثال آخر مع إضافة ترويسة وذيل:

np.savetxt('array_hf.csv', [arr], delimiter=',', fmt='%d' , header='A Sample 2D Numpy Array :: Header', footer='This is footer')
"""
# A Sample 2D Numpy Array :: Header
6,1,4,2,18,9,3,4,2,8,11
# This is footer
"""

مثال آخر مع مصفوفة ثنائية الأبعاد:

arr2D = np.array([[11, 12, 13, 22], [21, 7, 23, 14], [31, 10, 33, 7]])
np.savetxt('2darray.csv', arr2D, delimiter=',', fmt='%d')
"""
11,12,13,22
21,7,23,14
31,10,33,7
"""

أيضاً، بدلاً من حفظ مصفوفة كاملة ثنائية الأبعاد في ملف csv ، إذا أردنا، يمكننا حفظ أعمدة أو صفوف فردية أو متعددة فقط.

# حفظ عمود
np.savetxt('a.csv', [arr2D[:,1]], delimiter=',', fmt='%d')
"""
12,7,10
"""
# حفظ سطر
np.savetxt('aa.csv', [arr2D[1] ], delimiter=',', fmt='%d')
"""
21,7,23,14
"""

ولحفظ مصفوفة مهيكلة Structured Numpy array:

dtype = [('Name', (np.str_, 10)), ('Marks', np.float64)]
structure = np.array([('Ali', 21.2, 5), ('Eyad', 22.3, 4)], dtype=dtype)
print(structure)
# [('Ali', 21.2, 5) ('Eyad', 22.3, 4)]
np.savetxt('structured.csv', structure, delimiter=',', fmt=['%s' , '%f', '%d'], header='Name,Marks,Age', comments='')
"""
Name,Marks,Age
Ali,21.2, 5
Eyad,22.3, 4
"""

وبما أن كل عنصر في المصفوفة الرقمية الخاصة بنا كان عبارة عن مزيج من سلسلة ، عدد عشري وعدد صحيح ، لذلك أثناء حفظه في ملف csv ، نقوم بتمرير خيارات التنسيق كلها أي  ["٪ s" ، "٪ f" ، "٪ d"]
ويمكنك لاحقاً تحميل الملف بعدة طرق، باستخدام loadtxt:

from numpy import loadtxt
# تحميل المصفوفة
data = loadtxt('data.csv', delimiter=',')
# طباعتها
print(data)

أو من باندا:

import pandas as pd 
data = pd.read_csv("filename.csv") 
# عرض أول 5 أسطر من الملف
data.head()
# إذا أردت عرض أسطر أكثر مرر عددها إلى الوسيط التالي
data.head(n=10)

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...