নম্পি অ্যারে টুপলে রূপান্তর করুন


108

দ্রষ্টব্য: এটি স্বাভাবিক টিউপল-থেকে-অ্যারে রূপান্তরটির বিপরীতে চেয়েছে।

আমাকে নেস্টেড টিপল হিসাবে একটি (মোড়ানো সি ++) ফাংশনে একটি যুক্তিটি পাস করতে হবে। উদাহরণস্বরূপ, নিম্নলিখিত কাজ করে

X = MyFunction( ((2,2),(2,-2)) )

নিম্নলিখিত নিম্নলিখিত না

X = MyFunction( numpy.array(((2,2),(2,-2))) )
X = MyFunction( [[2,2],[2,-2]] )

দুর্ভাগ্যক্রমে, আমি যে যুক্তিটি ব্যবহার করতে চাই তা আমার কাছে একটি অদ্ভুত অ্যারে হিসাবে আসে। এই অ্যারেতে কিছু এন এর জন্য সর্বদা মাত্রা 2xN থাকে, যা বেশ বড় হতে পারে।

এটিকে একটি টুপলে রূপান্তর করার কোনও সহজ উপায় আছে কি? আমি জানি যে আমি কেবল নতুন টিউপল তৈরি করে লুপটি করতে পেরেছি, তবে নম্পি অ্যারে সরবরাহের জন্য যদি কিছু সুন্দর অ্যাক্সেস থাকে তবে পছন্দ করব।

যদি আমি আশা করি যত সুন্দরভাবে এটি করা সম্ভব না হয় তবে লুপিং দ্বারা এটি করার সর্বোত্তম উপায় কোনটি বা কী?

উত্তর:



26

এখানে একটি ফাংশন যা এটি করবে:

def totuple(a):
    try:
        return tuple(totuple(i) for i in a)
    except TypeError:
        return a

এবং একটি উদাহরণ:

>>> array = numpy.array(((2,2),(2,-2)))
>>> totuple(array)
((2, 2), (2, -2))

1
দুর্দান্ত জেনারালাইজেশন। পাইথন নবাগত হিসাবে, যদিও, আমি অবাক হয়েছি যে এটি এমন এক শর্তের জন্য ব্যতিক্রম ব্যবহার করা ভাল স্টাইল হিসাবে বিবেচিত যা অ-ব্যতিক্রমী রাষ্ট্রের মতো প্রায় সাধারণ। কমপক্ষে সি ++ এ, ব্যতিক্রমগুলি দ্বারা প্রবাহ নিয়ন্ত্রণ সাধারণত অস্বীকার করা হয়। এটা যদি ভাল হয় পরীক্ষা type(a)==numpy.ndarray?
মাইক 15

9
এটি "হাঁস-টাইপিং" এবং ইএএফটি ধারণার কারণে অজগরটিতে খুব সাধারণ, এখানে আরও রয়েছে: ডকস.পাইথন.আর.গ্লোসারি । Html#term-duck-typing । এই পদ্ধতির সুবিধা হ'ল এটি যে কোনও নেস্টেড ক্রমকে কেবল একটি অ্যারে নয়, নেস্টেড টিপলসে রূপান্তর করবে। একটি জিনিস যা আমার করা উচিত ছিল তা হ'ল ব্লক ব্যতীত আমি কোন ত্রুটিগুলি পরিচালনা করতে চাই তা নির্দিষ্ট করে।
দ্বি রিকো

3
সি ++ এ ব্যতিক্রম বিভিন্ন কারণে শর্তসাপেক্ষের তুলনায় ধীর। পাইথনে, তারা পারফরম্যান্সের ক্ষেত্রে প্রায় একই - আমরা আমাদের সি ++ অন্তর্দৃষ্টি দরজাতে যাচাই করতে হবে এমন এক জায়গা।
dbn

8

আমি সন্তুষ্ট ছিল না, তাই আমি অবশেষে এটি ব্যবহার করেছি:

>>> a=numpy.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])

>>> tuple(a.reshape(1, -1)[0])
(1, 2, 3, 4, 5, 6)

আমি জানি না এটি দ্রুত কিনা, তবে এটি আরও কার্যকর দেখায়;)


3
আমি টিপলের জন্য যে আকারটি চেয়েছিলাম সেটি ছিল না।
মাইক

5

অন্য একটি বিকল্প

tuple([tuple(row) for row in myarray])

আপনি যদি নুমপি অ্যারেগুলি সি ++ ফাংশনে প্রেরণ করছেন তবে আপনি সাইথন বা এসডাব্লুআইজি ব্যবহারের দিকেও নজর রাখতে পারেন।


এটি টুপলে রূপান্তর করে না। একটি তালিকায় রূপান্তর করে?
পিটার

তুমি কি চেষ্টা করেছ? আমি দৌড়ানোর সময় এটি একটি টিপল তৈরি করে Note নোট করুন যে শেষ ফাংশনটি টুপল, যা একটি টুপল ফেরত। বাইরের টিপল ছাড়া যদি আপনার কেবল [...] অংশ থাকে তবে আপনি টিপলগুলির একটি তালিকা পাবেন।
গ্রেগ ভন উইঙ্কেল

একটি দ্রুত পদ্ধতি আছে?
ভিকারোবট

1
listবর্গাকার বন্ধনী বাদ দিয়ে মধ্যবর্তী তৈরি করা এড়াতে পারতেন , যেমনtuple(tuple(row) for row in myarray)
নরোক 2

1

আপনি যদি দীর্ঘ কাটা পছন্দ করেন তবে এখানে a_m এর জন্য টিপল (টিপল (a_m.tolist ()) অন্য একটি উপায় রয়েছে

from numpy import array
a = array([[1, 2],
           [3, 4]])
tuple(tuple(a_m.tolist()) for a_m in a )

আউটপুট ((1, 2), (3, 4))

কেবল দ্রষ্টব্য (টিপল (a_m.tolist ()) a_m এর জন্য a) একটি জেনারেটরের এক্সপ্রেশন দেবে। গ্রেগ ভন উইঙ্কেলের উত্তরে @ নরোক 2-এর মন্তব্যে অনুপ্রাণিতের সাজান

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