পাইথন 2 এবং 3 এর মধ্যে নিম্পী অ্যারেগুলির আচার বেমানান


163

আমি MNIST ডেটা সেটটি লিঙ্ক লোড করার চেষ্টা করছি এখানে পাইথন 3.2 এই প্রোগ্রাম ব্যবহার:

import pickle
import gzip
import numpy


with gzip.open('mnist.pkl.gz', 'rb') as f:
    l = list(pickle.load(f))
    print(l)

দুর্ভাগ্যক্রমে, এটি আমাকে ত্রুটি দেয়:

Traceback (most recent call last):
   File "mnist.py", line 7, in <module>
     train_set, valid_set, test_set = pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)

তারপরে আমি পাইথন ২.7 এ আচারযুক্ত ফাইলটি ডিকোড করার চেষ্টা করেছি এবং এটিকে পুনরায় এনকোড করব। সুতরাং, আমি পাইথন ২.7 এ এই প্রোগ্রামটি চালিয়েছি:

import pickle
import gzip
import numpy


with gzip.open('mnist.pkl.gz', 'rb') as f:
    train_set, valid_set, test_set = pickle.load(f)

    # Printing out the three objects reveals that they are
    # all pairs containing numpy arrays.

    with gzip.open('mnistx.pkl.gz', 'wb') as g:
        pickle.dump(
            (train_set, valid_set, test_set),
            g,
            protocol=2)  # I also tried protocol 0.

এটি ত্রুটি ছাড়াই চলেছিল, তাই আমি পাইথন ৩.২-এ এই প্রোগ্রামটি পুনরায় পুনঃস্থাপন করেছি:

import pickle
import gzip
import numpy

# note the filename change
with gzip.open('mnistx.pkl.gz', 'rb') as f:
    l = list(pickle.load(f))
    print(l)

তবে এটি আমাকে আগের মতো ত্রুটি দিয়েছে। আমি এটি কীভাবে কাজ করব?


এটি এমএনআইএসটি ডেটাসেট লোড করার জন্য একটি ভাল পদ্ধতির।


2.7 এবং 3.x এর মধ্যে সামঞ্জস্যতা বিরতি রয়েছে বিশেষত স্ট্রিং বনাম ইউনিকোড। এবং একটি নমপি অবজেক্টটি বাছাইয়ের জন্য উভয় সিস্টেমই নমপি মডিউলটি লোড করতে পারে তবে এই মডিউলগুলি পৃথক। দুঃখিত, আমার কাছে কোনও উত্তর নেই তবে এটি সম্ভবত সক্ষম হবে না এবং সম্ভবত পরামর্শযুক্ত নয়। যদি এটি বড় জিনিস হয় (জিজিপ), তবে পিটবেবলস সহ এইচডিএফ 5 হতে পারে ??
ফিল कूপার

@ ফিলকোপার: ধন্যবাদ, আপনার মন্তব্য (একটি উত্তর হিসাবে এটি পোস্ট?) আমাকে সঠিক উত্তরে আঁকড়ে রেখেছে। আমি এইচডিএফ 5 ব্যবহার করতে পারতাম, তবে এটি শিখতে জটিল মনে হয়েছিল, তাই আমি নামি.স্যাভ / লোড নিয়ে চলেছি এবং এটি কাজ করেছে।
নিল জি

এইচ 5 পিস ব্যবহার করা খুব সহজ, নিখরচায় অ্যারে ব্যবহার করে নেবুলাস সামঞ্জস্যতার সমস্যাগুলি সমাধান করা প্রায় সহজেই সহজ।
ডেভপি

আপনি বলছেন যে আপনি "পাইথন ২.7 এর আওতায় এই প্রোগ্রামটি চালিয়েছেন"। ঠিক আছে তবে আপনি কি ৩.২ এর অধীনে চলেছেন? :-) একই?
লেনার্ট রেগেব্রো

@ লেননার্টজেজব্রো: দ্বিতীয় প্রোগ্রামটি চালানোর পরে অ্যারেগুলিকে বেছে নিয়েছে, আমি পাইথন ৩.২-তে প্রথম প্রোগ্রাম (ফাইলের নাম mnistx.pkl.gz প্রতিস্থাপন) চালিয়েছি। এটি কার্যকর হয়নি, যা আমি মনে করি একরকম বেমানানতার চিত্র তুলে ধরে।
নিল জি

উত্তর:


141

এটি একরকম বেমানান বলে মনে হচ্ছে। এটি একটি "বাইনস্ট্রিং" অবজেক্টটি লোড করার চেষ্টা করছে, এটি ASCII হিসাবে ধরে নেওয়া হচ্ছে, যখন এই ক্ষেত্রে এটি বাইনারি ডেটা। এটি যদি পাইথন 3 আনপিকলারে কোনও বাগ হয় বা আঙ্কুল দ্বারা পিকারের কোনও "অপব্যবহার" হয়, আমি জানি না।

এখানে একটি কর্মপরিকল্পনা কিছু, কিন্তু আমি জানি না যে তথ্য এই মুহুর্তে কতটা অর্থপূর্ণ:

import pickle
import gzip
import numpy

with open('mnist.pkl', 'rb') as f:
    u = pickle._Unpickler(f)
    u.encoding = 'latin1'
    p = u.load()
    print(p)

পাইথন 2 এ এটিকে পিক করা এবং তারপরে পুনরায় বিকিক করা আবার একই সমস্যা তৈরি করতে চলেছে, সুতরাং আপনাকে এটি অন্য ফর্ম্যাটে সংরক্ষণ করতে হবে।


211
আপনি pickle.load(file_obj, encoding='latin1')(কমপক্ষে পাইথন ৩.৩ এ) ব্যবহার করতে পারেন । এটি কাজ করে বলে মনে হচ্ছে।
টম অল্ডক্রফ্ট

7
যারা ন্যালি লোড ব্যবহার করছেন এবং অনুরূপ সমস্যার মুখোমুখি হচ্ছেন: সেখানে পাশাপাশি এনকোডিং করাও সম্ভব:np.load('./bvlc_alexnet.npy', encoding='latin1')
সেরজ জাহারচেনকো

এটি encoding='latin1'ব্যর্থ হয় যখন আমার জন্য কাজ করে । ধন্যবাদ!
গিলিম কাকুরুল

130

যদি আপনি পাইথন 3 এ এই ত্রুটিটি পেয়ে থাকেন, তবে পাইথন 2 এবং পাইথন 3 এর মধ্যে এটি একটি বেমানান সমস্যা হতে পারে, আমার পক্ষে সমাধানটি এনকোডিংয়ের loadসাথে ছিল latin1:

pickle.load(file, encoding='latin1')

16

এটি পাইথন 2 এবং পাইথন 3 এর মধ্যে একটি বেমানান সমস্যা বলে মনে হচ্ছে আমি এমএনআইএসটি ডেটাসেটটি লোড করার চেষ্টা করেছি

    train_set, valid_set, test_set = pickle.load(file, encoding='iso-8859-1')

এবং এটি পাইথনের জন্য কাজ করেছে 3.5.2


7

দেখে মনে হচ্ছে ইউনিকোডে চলে যাওয়ার কারণে 2.x এবং 3.x এর মধ্যে আচারে কিছু সামঞ্জস্যতার সমস্যা রয়েছে। আপনার ফাইলটি অজগর ২.x এর সাথে মিশ্রিত এবং 3.x এ ডিকোডিং হওয়া সমস্যাযুক্ত হতে পারে।

আমি এটিকে পাইথন ২.x দিয়ে কেটে ফেলা এবং এমন একটি বিন্যাসে সংরক্ষণের পরামর্শ দেব যা আপনি ব্যবহার করছেন এমন দুটি সংস্করণ জুড়ে আরও সুন্দরভাবে খেলবে।


2
এটাই আমি করার চেষ্টা করছিলাম। আপনি কোন ফর্ম্যাট সুপারিশ করবেন?
নিল জি

5
আমি মনে করি সমস্যাটি নম্পিটি টাইপ এনকোডিং করে থাকতে পারে যা একটি স্ট্রিং হতে পারে। যাই হোক না কেন, অজগর 2 এবং 3 এর মধ্যে ব্যবধানটি পূরণ করতে আমি numpy.save/load ব্যবহার করে শেষ করেছি এবং এটি কার্যকর হয়েছে।
নিল জি

7

আমি কেবল এই স্নিপেটে হোঁচট খেয়েছি। আশা করি এটি সামঞ্জস্যতার বিষয়টি পরিষ্কার করতে সহায়তা করবে।

import sys

with gzip.open('mnist.pkl.gz', 'rb') as f:
    if sys.version_info.major > 2:
        train_set, valid_set, test_set = pickle.load(f, encoding='latin1')
    else:
        train_set, valid_set, test_set = pickle.load(f)

আরও পরিবর্ধক তথ্য যুক্ত বিবেচনা করুন। এটি কীভাবে সমস্যার সমাধান করবে?
টম আরান্দা

@ সাহায্য করুন যাতে সাহায্য করুন, দয়া করে উত্তরের ব্যাখ্যাটি দিন
সারথ সাদাসিভান পিল্লাই

6

চেষ্টা করুন:

l = list(pickle.load(f, encoding='bytes')) #if you are loading image data or 
l = list(pickle.load(f, encoding='latin1')) #if you are loading text data

pickle.loadপদ্ধতির ডকুমেন্টেশন থেকে :

Keyচ্ছিক কীওয়ার্ড আর্গুমেন্টগুলি হ'ল ফিক্স-ইম্পোর্টস, এনকোডিং এবং ত্রুটিগুলি, যা পাইথন 2 দ্বারা উত্পাদিত আচার স্ট্রিমের জন্য সামঞ্জস্যতা সমর্থন নিয়ন্ত্রণ করতে ব্যবহৃত হয়।

যদি ফিক্স_ইম্পোর্টস সত্য হয় তবে আচারটি পাইথন 3 এ ব্যবহৃত নতুন নামের সাথে পুরানো পাইথন 2 টি নাম ম্যাপ করার চেষ্টা করবে।

এনকোডিং এবং ত্রুটিগুলি পাইথন 2 দ্বারা আচারযুক্ত 8-বিট স্ট্রিংয়ের উদাহরণগুলি কীভাবে ডিকোড করতে হবে তা আচারকে বলে; এই ডিফল্ট যথাক্রমে 'ASCII' এবং 'কঠোর'। এনকোডিংটি এই 8-বিট স্ট্রিংয়ের উদাহরণগুলি বাইটস অবজেক্ট হিসাবে পড়তে 'বাইটস' হতে পারে।


0

এখানে হিকল রয়েছে যা আচারের চেয়ে দ্রুত এবং সহজ। আমি এটি আচার ডাম্পে সংরক্ষণ এবং পড়ার চেষ্টা করেছি তবে পড়ার সময় প্রচুর সমস্যা হয়েছিল এবং এক ঘন্টা নষ্ট করেছিলাম এবং এখনও একটি সমাধান খুঁজে পেলাম না যদিও আমি একটি চ্যাটবট তৈরি করতে আমার নিজের ডেটা নিয়ে কাজ করছি।

vec_xএবং vec_yনাম্বার অ্যারে হয়:

data=[vec_x,vec_y]
hkl.dump( data, 'new_data_file.hkl' )

তারপরে আপনি কেবল এটি পড়ুন এবং অপারেশনগুলি সম্পাদন করুন:

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