NumPy অ্যারে থেকে নির্দিষ্ট সারি এবং কলাম নির্বাচন করা


96

আমি এখানে কী বোকা জিনিস ভুল করছি তা জানার চেষ্টা করতে আমি পাগল হয়ে যাচ্ছি।

আমি নম্পপি ব্যবহার করছি এবং আমার নির্দিষ্ট সারি সূচক এবং নির্দিষ্ট কলাম সূচক রয়েছে যা থেকে আমি নির্বাচন করতে চাই। আমার সমস্যার সংক্ষিপ্তসারটি এখানে:

import numpy as np

a = np.arange(20).reshape((5,4))
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11],
#        [12, 13, 14, 15],
#        [16, 17, 18, 19]])

# If I select certain rows, it works
print a[[0, 1, 3], :]
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [12, 13, 14, 15]])

# If I select certain rows and a single column, it works
print a[[0, 1, 3], 2]
# array([ 2,  6, 14])

# But if I select certain rows AND certain columns, it fails
print a[[0,1,3], [0,2]]
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: shape mismatch: objects cannot be broadcast to a single shape

ইহা কি জন্য ঘটিতেছে? অবশ্যই আমার 1 ম, দ্বিতীয়, এবং চতুর্থ সারি এবং 1 ম এবং 3 য় কলামগুলি নির্বাচন করতে সক্ষম হওয়া উচিত? আমি যে ফলাফলটির প্রত্যাশা করছি তা হ'ল:

a[[0,1,3], [0,2]] => [[0,  2],
                      [4,  6],
                      [12, 14]]

সন্ধানযোগ্যতা উন্নত করতে নামি-কাঁচকে ট্যাগ করেছেন । (এছাড়াও 'স্লাইস' এবং 'স্লাইসিং' শব্দটি
সরলরেখায়

উত্তর:


86

অভিনব সূচীকরণের জন্য আপনাকে প্রতিটি মাত্রার জন্য সমস্ত সূচক সরবরাহ করতে হবে। আপনি প্রথমটির জন্য 3 টি সূচক সরবরাহ করছেন এবং দ্বিতীয়টির জন্য কেবল 2 টি সূচক সরবরাহ করছেন, সুতরাং ত্রুটি। আপনি এরকম কিছু করতে চান:

>>> a[[[0, 0], [1, 1], [3, 3]], [[0,2], [0,2], [0, 2]]]
array([[ 0,  2],
       [ 4,  6],
       [12, 14]])

এটি অবশ্যই লিখতে ব্যথা, যাতে আপনি সম্প্রচার আপনাকে সহায়তা করতে পারেন:

>>> a[[[0], [1], [3]], [0, 2]]
array([[ 0,  2],
       [ 4,  6],
       [12, 14]])

আপনি যদি অ্যারে দিয়ে তালিকা তৈরি করেন না তবে সূচী করা এটি করা সহজ:

>>> row_idx = np.array([0, 1, 3])
>>> col_idx = np.array([0, 2])
>>> a[row_idx[:, None], col_idx]
array([[ 0,  2],
       [ 4,  6],
       [12, 14]])

4
ধন্যবাদ, আমি জানতাম না যে আপনি এটি করতে পারেন! সম্প্রচার অদ্ভুত এবং দুর্দান্ত ... দু'ব্যাপি বছর পরে, আমি এখনও এটি অভ্যস্ত হয়ে উঠছি।
প্রবীণ

4
ধন্যবাদ! অন্য উত্তরগুলি নির্বাচিত ম্যাট্রিক্স ফেরত দেওয়ার ক্ষেত্রে আমার প্রশ্নের সঠিক উত্তর দিচ্ছিল, তবে এই উত্তরটি কার্যনির্বাহীকরণের বিষয়টিও সম্বোধন করার সময় সম্বোধন করেছে (কীভাবে একটি [[0,1,3] সেট করতে হবে, [0,2]] = 0 , উদাহরণ স্বরূপ).
মাইক সি

4
@ জাইম - ঠিক গতকালই আমি আপনাকে পরামর্শ দিচ্ছিলাম
প্রবীণ

4
সিনট্যাক্স কেন এভাবে কাজ করে সে সম্পর্কে কেউ ব্যাখ্যা সরবরাহ করতে পারেন? এটি প্রথম উদাহরণ উভয় জন্য তৃতীয় নয় কিন্তু কারণ কি। এবং এছাড়াও, কীভাবে তাদের নিজস্ব তালিকাগুলিতে পছন্দসই সূচকগুলি encapsulating এটি সমাধান করতে পারে? আপনাকে ধন্যবাদ
এটোস

4
সারিগুলিকে কেন বাসা বাঁধতে হবে এবং কোলগুলি নেই?
আতুরস্যাম

86

টোনের পরামর্শ অনুসারে, একটি সরল হ্যাক হ'ল প্রথমে সারিগুলি নির্বাচন করতে হবে এবং তারপরে কলামগুলি নির্বাচন করতে হবে

>>> a[[0,1,3], :]            # Returns the rows you want
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [12, 13, 14, 15]])
>>> a[[0,1,3], :][:, [0,2]]  # Selects the columns you want as well
array([[ 0,  2],
       [ 4,  6],
       [12, 14]])

[সম্পাদনা] অন্তর্নির্মিত পদ্ধতি: np.ix_

আমি সম্প্রতি আবিষ্কার করেছি যে ন্যাম্পি আপনাকে @ জাইম প্রস্তাবিত ঠিক তেমন কাজ করার জন্য একটি অন্তর্নির্মিত ওয়ান-লাইনার সরবরাহ করে , তবে সম্প্রচার সিনট্যাক্স ব্যবহার না করে (যা পাঠযোগ্যতার অভাবে ভোগে)। ডক্স থেকে:

আইএক্স_একটি ব্যবহার করে দ্রুত সূচক অ্যারে তৈরি করা যায় যা ক্রস প্রোডাক্টকে সূচক করে। a[np.ix_([1,3],[2,5])]অ্যারে ফেরৎ [[a[1,2] a[1,5]], [a[3,2] a[3,5]]]

সুতরাং আপনি এটি ব্যবহার করুন:

>>> a = np.arange(20).reshape((5,4))
>>> a[np.ix_([0,1,3], [0,2])]
array([[ 0,  2],
       [ 4,  6],
       [12, 14]])

এবং এটি যেভাবে কাজ করে তা হ'ল এটি জ্যামের পরামর্শ অনুসারে অ্যারেঞ্জিংয়ের যত্ন নেয়, যাতে সম্প্রচারটি সঠিকভাবে ঘটে:

>>> np.ix_([0,1,3], [0,2])
(array([[0],
        [1],
        [3]]), array([[0, 2]]))

এছাড়াও, মাইকিসি যেমন একটি মন্তব্যে বলেছেন np.ix_, আমার দৃষ্টিভঙ্গি ফিরিয়ে দেওয়ার সুবিধা রয়েছে, যা আমার প্রথম (প্রাক সম্পাদনা) উত্তর দেয় নি। এর অর্থ আপনি এখন সূচকযুক্ত অ্যারেতে নির্ধারণ করতে পারবেন :

>>> a[np.ix_([0,1,3], [0,2])] = -1
>>> a    
array([[-1,  1, -1,  3],
       [-1,  5, -1,  7],
       [ 8,  9, 10, 11],
       [-1, 13, -1, 15],
       [16, 17, 18, 19]])

4
কয়েকটি পরীক্ষায়, আমি np.ix_প্রথম কলামগুলি এবং তারপরে সারিগুলি নির্বাচনের পদ্ধতির চেয়েও দ্রুত (এবং প্রায় 1x আকারের 1K-10K এর বর্গাকার অ্যারেগুলির পরীক্ষাগুলি হিসাবে দ্রুত যেখানে আপনি সমস্ত সারি এবং কলামগুলি পুনরায় তালিকাভুক্ত করেছেন) খুঁজে পেয়েছি found
নাথান

7

ব্যবহার:

 >>> a[[0,1,3]][:,[0,2]]
array([[ 0,  2],
   [ 4,  6],
   [12, 14]])

বা:

>>> a[[0,1,3],::2]
array([[ 0,  2],
   [ 4,  6],
   [12, 14]])

10
যদিও এটি সঠিক, আপনি কেন এটি সঠিক তা ব্যাখ্যা করে আরও কিছু তথ্য পোস্ট করার বিষয়টি বিবেচনা করা উচিত ।
ইবার

2

ব্যবহার np.ix_(যেমন অন্যদের দ্বারা বললেন) সবচেয়ে সুবিধাজনক উপায় এটা করতে, কিন্তু এখানে এটা করতে আরেকটি মজার উপায় হল:

>>> rows = [0, 1, 3]
>>> cols = [0, 2]

>>> a[rows].T[cols].T

array([[ 0,  2],
       [ 4,  6],
       [12, 14]])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.