2010-12-23 15 views
6

मैं एक ग्राफ एक numpy बूलियन सरणी (G.adj.dtype == bool) के रूप में प्रतिनिधित्व किया है। यह मेरी खुद की ग्राफ लाइब्रेरी लिखने में होमवर्क है, इसलिए मैं नेटवर्कक्स का उपयोग नहीं कर सकता। मैं इसे एक फाइल में डंप करना चाहता हूं ताकि मैं इसके साथ परेशान हो सकूं, लेकिन मेरे जीवन के लिए मैं काम नहीं कर सकता कि कैसे इसे पुनर्प्राप्त करने योग्य फैशन में नुकीला डंप करना है।numpy में एक बुलियन मैट्रिक्स कैसे डंप करने के लिए?

मैंने G.adj.tofile को आजमाया है, जिसने सही ग्राफ (आईएसएच) को सही/गलत की एक लंबी पंक्ति के रूप में लिखा है। लेकिन यह पढ़, एक 1x1 सरणी देने पर fromfile barfs, और loadtxt एक ValueError: invalid literal for int को जन्म देती है। np.savetxt काम करता है लेकिन मैट्रिक्स को 0/1 फ्लोट्स की सूची के रूप में सहेजता है, और loadtxt(..., dtype=bool) उसी वैल्यूएरर के साथ विफल रहता है।

अंत में, मैं networkx.write_dot साथ networkx.from_numpy_matrix की कोशिश की है, लेकिन वह डॉट स्रोत है, जो networkx.read_dot तोड़ दिया में एक किनारे [weight=True] दे दी है।

उत्तर

4

सहेजने के लिए:

numpy.savetxt('arr.txt', G.adj, fmt='%s') 

ठीक करने के लिए:

G.adj = numpy.genfromtxt('arr.txt', dtype=bool) 

HTH!

4

यह मेरा परीक्षण का मामला है:

m = numpy.random(100,100) > 0.5 

अंतरिक्ष दक्षता

numpy.savetxt('arr.txt', obj, fmt='%s') एक 54 kB फ़ाइल बनाता है।

numpy.savetxt('arr.txt', obj, fmt='%d') एक बहुत छोटी फ़ाइल (20 केबी) बनाता है।

cPickle.dump(obj, open('arr.dump', 'w')) है, जो एक 40KB फ़ाइल बनाता है,

समय दक्षता

numpy.savetxt('arr.txt', obj, fmt='%s') 45 एमएस

numpy.savetxt('arr.txt', obj, fmt='%d') 10 एमएस

cPickle.dump(obj, open('arr.dump', 'w')), 2.3 एमएस

निष्कर्ष

पाठ स्वरूप (%s) के साथ प्रयोग के savetxt यदि मानव पठनीयता की जरूरत है सांख्यिक फ़ॉर्मेट (%d) के साथ savetxt का उपयोग करता है, तो अंतरिक्ष विचार एक मुद्दा है और cPickle का उपयोग करता है, तो समय एक मुद्दा है।

+0

उस मामले में 'obj' क्या है? क्या यह 'एम' है? – petRUShka

4

मेटाडाटा (dtype, आयाम) सहित अपने सरणी को बचाने के लिए सबसे आसान तरीका है numpy.save() और numpy.load() उपयोग करने के लिए है:

a = array([[False, True, False], 
      [ True, False, True], 
      [False, True, False], 
      [ True, False, True], 
      [False, True, False]], dtype=bool) 
numpy.save("data.npy", a) 
numpy.load("data.npy") 
# array([[False, True, False], 
#  [ True, False, True], 
#  [False, True, False], 
#  [ True, False, True], 
#  [False, True, False]], dtype=bool) 

a.tofile() और numpy.fromfile() रूप में अच्छी तरह काम करेगा, लेकिन किसी भी मेटाडाटा को बचाने नहीं है। आप fromfile() को dtype=bool पास करनी होगी और एक आयामी सरणी होना चाहिए अपने मूल आकार में reshape() घ मिल जाएगा।

1

मुझे पता है कि सवाल काफी पुराना है, लेकिन मैं पायथन 3 बेंचमार्क जोड़ना चाहता हूं। यह पिछले एक से थोड़ा अलग है।

सबसे पहले मैं, याद करने के लिए काफी मात्रा में डेटा लोड int8 numpy सरणी के लिए यह संभव मूल्यों के रूप में परिवर्तित केवल 0 और 1 साथ और फिर इसे डंप दो तरीकों का उपयोग HDD करने के लिए।

from timer import Timer 
import numpy 
import pickle 

# Load data part of code is omitted. 

prime = int(sys.argv[1]) 

np_table = numpy.array(check_table, dtype=numpy.int8) 
filename = "%d.dump" % prime 

with Timer() as t: 
    pickle.dump(np_table, open("dumps/pickle_" + filename, 'wb')) 

print('pickle took %.03f sec.' % (t.interval)) 

with Timer() as t: 
    numpy.savetxt("dumps/np_" + filename, np_table, fmt='%d') 

print('savetxt took %.03f sec.' % (t.interval)) 

समय मापने

It took 50.700 sec to load data number 11 
pickle took 0.010 sec. 
savetxt took 1.930 sec. 

It took 1297.970 sec to load data number 29 
pickle took 0.070 sec. 
savetxt took 242.590 sec. 

It took 1583.380 sec to load data number 31 
pickle took 0.090 sec. 
savetxt took 334.740 sec. 

It took 3855.840 sec to load data number 41 
pickle took 0.610 sec. 
savetxt took 1367.840 sec. 

It took 4457.170 sec to load data number 43 
pickle took 0.780 sec. 
savetxt took 1654.050 sec. 

It took 5792.480 sec to load data number 47 
pickle took 1.160 sec. 
savetxt took 2393.680 sec. 

It took 8101.020 sec to load data number 53 
pickle took 1.980 sec. 
savetxt took 4397.080 sec. 

आकार को मापने

630K np_11.dump 
79M np_29.dump 
110M np_31.dump 
442M np_41.dump 
561M np_43.dump 
875M np_47.dump 
1,6G np_53.dump 

315K pickle_11.dump 
40M pickle_29.dump 
55M pickle_31.dump 
221M pickle_41.dump 
281M pickle_43.dump 
438M pickle_47.dump 
798M pickle_53.dump 

तो अजगर 3 pickle संस्करण numpy.savetxt की तुलना में बहुत तेजी से होता है और लगभग 2 गुना कम HDD मात्रा उपयोग कर रहा है।

+0

लेकिन अचार परिणाम काफी अजीब हैं क्योंकि वे सर्वोत्तम मामलों में मेरे एचडीडी शो से कम हैं। तो मुझे लगता है कि अचार और लिनक्स ने पृष्ठभूमि में किया था, और यह इस तरह के छोटे समय का वास्तव में कारण है। – petRUShka

संबंधित मुद्दे