কোনও নমপি অ্যারে এর সমস্ত সীমানায় 0 আছে কিনা তা পরীক্ষা করুন [বন্ধ]


13

কোন বহুমাত্রিক নিমপি অ্যারেটির চারদিকে 0 আছে কিনা তা যাচাই করার দ্রুততম উপায় কী হবে?

সুতরাং, একটি সাধারণ 2D উদাহরণের জন্য, আমার কাছে রয়েছে:

x = np.random.rand(5, 5)
assert np.sum(x[0:,  0]) == 0
assert np.sum(x[0,  0:]) == 0
assert np.sum(x[0:, -1]) == 0
assert np.sum(x[-1, 0:]) == 0

যদিও এটি 2 ডি ক্ষেত্রে সঠিক হতে পারে ঠিক ততক্ষণে উচ্চতর মাত্রাগুলির জন্য লেখা কিছুটা ক্লান্তিকর এবং আমি ভাবছিলাম যে এটিকে দক্ষ এবং আরও রক্ষণাবেক্ষণের জন্য আমি এখানে ব্যবহার করতে পারি এমন কিছু চতুর নকল কৌশল আছে কিনা trick


8
np.all (x[:, 0] == 0)যোগফলের চেয়ে নিরাপদ হবে না ? সমস্ত সংখ্যাটি ইতিবাচক হলেই যোগফল পরীক্ষা সঠিক correct
ডেমি-লুন


1
@ ডেমি-লিউম বোঝাপড়া করে। আমার ক্ষেত্রে, সমস্ত কিছু> = 0 হবে তবে আপনার মন্তব্যের প্রশংসা করা হয়েছে :)
লুকা

1
একটি 3D ক্ষেত্রে, আপনি কিউবটির মুখগুলি (এর মধ্যে ছয়টি) বা কিনারা (তার মধ্যে 12 টি) বোঝাতে চাইছেন?
রিকার্ডো বুকো

@ রিকার্ডো বুকো হ্যাঁ, 6 টি মুখ। তবে আমার সমস্যাটি হ'ল এটি 3 এর চেয়ে বেশি মাত্রা যেতে পারে
লুকা

উত্তর:


7

আপনি এটি কীভাবে করতে পারেন তা এখানে:

assert(all(np.all(np.take(x, index, axis=axis) == 0)
           for axis in range(x.ndim)
           for index in (0, -1)))

np.take "অভিনব" সূচক হিসাবে একই জিনিস।


1
@ লুকা: ডকুমেন্টেশনটি এটি পরিষ্কার করে না, তবে numpy.takeএকটি অনুলিপি তৈরি করে। এটি কোনও দৃশ্যের ভিত্তিতে কোডের চেয়েও খারাপ সম্পাদন করতে পারে। (টাইমিং নিশ্চিত করা করার প্রয়োজন হতে হবে - NumPy দৃশ্য দক্ষতা কখনও কখনও অদ্ভুত।)
user2357112 মনিকা সমর্থন

1
@ রিকার্ডোবুকো: len(x.shape)আরও সহজভাবে লেখা যেতে পারে x.ndim
ব্যবহারকারী 2357112

1
@ ব্যবহারকারী 2357112 সমর্থন মনিকা ধন্যবাদ, আমি এটি ঠিক করেছি :)
রিকার্ডো বুকো

5
এছাড়াও, তালিকা উপলব্ধির ব্যবহার allশর্ট সার্কিট থেকে বাধা দেয় from আপনি একটি জেনারেটর অভিব্যক্তি ব্যবহার করতে বন্ধনী দূর করতে পারবে? যার ফলে allএকটি একক যত তাড়াতাড়ি ফিরতে numpy.allকল আয় False
ব্যবহারকারী 2357112

1
@ ইউজার 2357112 সাপোর্টমোনিকা ট্রু !!
রিকার্ডো বুকো 11

5

এখানে এমন একটি উত্তর দেওয়া আছে যা আপনার আগ্রহী অ্যারেগুলির অংশগুলি যাচাই করে এবং পুরো অ্যারের আকারটি একটি মুখোশ তৈরিতে সময় নষ্ট করে না। পাইথন-স্তরের লুপ রয়েছে তবে এটি সংক্ষিপ্ত, অ্যারের আকারের পরিবর্তে পুনরাবৃত্তির সংখ্যার সাথে সমানুপাতিক।

def all_borders_zero(array):
    if not array.ndim:
        raise ValueError("0-dimensional arrays not supported")
    for dim in range(array.ndim):
        view = numpy.moveaxis(array, dim, 0)
        if not (view[0] == 0).all():
            return False
        if not (view[-1] == 0).all():
            return False
    return True

এমন কোনও পরিস্থিতি আছে যেখানে not (view[0] == 0).all()সমতুল্য নয় view[0].any()?
পল পান্জার

@ পলপাঞ্জার: আমি মনে করি view[0].any()এটিও কাজ করবে। দুটি বিকল্পের সাথে জড়িত কাস্টিং এবং বাফারিংয়ের দক্ষতার প্রভাব সম্পর্কে আমি পুরোপুরি নিশ্চিত নই - view[0].any()তাত্ত্বিকভাবে দ্রুত প্রয়োগ করা যেতে পারে তবে আমি এর আগে অদ্ভুত ফলাফল দেখেছি এবং আমি বাফারিং জড়িত তা পুরোপুরি বুঝতে পারি না।
ব্যবহারকারী 2357112 মনিকে

আমি মনে করি view[0].view(bool).any()উচ্চ গতির সমাধান হবে।
পল পাঞ্জার


(এছাড়াও কিনা argmaxবা anyনেতিবাচক শূন্য হ্যান্ডলিং নিয়মিত শুন্যতে অসম হিসাবে একটি বুলিয়ান দৃশ্য মাধ্যম ব্যবহার।)
user2357112 মনিকা সমর্থন

2

আমি অ্যারেটিকে পুনরায় আকার দিয়েছিলাম এবং তারপরে পুনরাবৃত্তি করি। দুর্ভাগ্যক্রমে, আমার উত্তর ধরে নিয়েছে যে আপনার কমপক্ষে তিনটি মাত্রা রয়েছে এবং সাধারণ ম্যাট্রিক্সের জন্য ত্রুটি ঘটবে, আপনাকে 1 & 2 মাত্রিক আকারের অ্যারেগুলির জন্য একটি বিশেষ ধারা যুক্ত করতে হবে। এছাড়াও, এটি ধীর হবে তাই সম্ভবত আরও ভাল সমাধান রয়েছে are

x = np.array(
        [
            [
                [0 , 1, 1, 0],
                [0 , 2, 3, 0],
                [0 , 4, 5, 0]
            ],
            [
                [0 , 6, 7, 0],
                [0 , 7, 8, 0],
                [0 , 9, 5, 0]
            ]
        ])

xx = np.array(
        [
            [
                [0 , 0, 0, 0],
                [0 , 2, 3, 0],
                [0 , 0, 0, 0]
            ],
            [
                [0 , 0, 0, 0],
                [0 , 7, 8, 0],
                [0 , 0, 0, 0]
            ]
        ])

def check_edges(x):

    idx = x.shape
    chunk = np.prod(idx[:-2])
    x = x.reshape((chunk*idx[-2], idx[-1]))
    for block in range(chunk):
        z = x[block*idx[-2]:(block+1)*idx[-2], :]
        if not np.all(z[:, 0] == 0):
            return False
        if not np.all(z[:, -1] == 0):
            return False
        if not np.all(z[0, :] == 0):
            return False
        if not np.all(z[-1, :] == 0):
            return False

    return True

যা উত্পাদন করবে

>>> False
>>> True

মূলত আমি সমস্ত মাত্রা একে অপরের শীর্ষে স্ট্যাক করে রাখি এবং তারপরে তাদের প্রান্তগুলি পরীক্ষা করতে সেগুলি দেখি।


এটি অ্যারের ভুল অংশগুলি পরীক্ষা করে। ত্রি-মাত্রিক অ্যারেটির জন্য, আমরা প্রতিটি অ্যার-ডাইমেনশনাল সুবারের কিনারা নয়, পুরো অ্যারের মুখগুলি পরীক্ষা করতে চাই।
ব্যবহারকারী 2357112

আহ, আরও বোধগম্য। আমি ভুল
বুঝেছি

1

সম্ভবত উপবৃত্তাকারী অপারেটরটি আপনি যা খুঁজছেন তা হ'ল যা অনেক মাত্রার জন্য কাজ করবে:

import numpy as np

# data
x = np.random.rand(2, 5, 5)
x[..., 0:, 0] = 0
x[..., 0, 0:] = 0
x[..., 0:, -1] = 0
x[..., -1, 0:] = 0

test = np.all(
    [
        np.all(x[..., 0:, 0] == 0),
        np.all(x[..., 0, 0:] == 0),
        np.all(x[..., 0:, -1] == 0),
        np.all(x[..., -1, 0:] == 0),
    ]
)

print(test)

এটি সমস্ত মুখ রঙ করবে না। উদাহরণস্বরূপ, এটি একটি (4, 4, 4) কিউব দিয়ে চেষ্টা করুন।
লুকা

মুখগুলি রঙ করার মাধ্যমে আপনি কী
বোঝেন

1

sliceকাজটি শেষ করতে আপনি এবং বুলিয়ান মাস্কিং ব্যবহার করতে পারেন :

def get_borders(arr):
    s=tuple(slice(1,i-1) for i in a.shape)
    mask = np.ones(arr.shape, dtype=bool)
    mask[s] = False
    return(arr[mask])

এই ফাংশনটি প্রথমে অ্যারের "কোর" টিপলকে আকার দেয় sএবং তারপরে একটি মুখোশ তৈরি করে যা Trueকেবল সীমানা পয়েন্টগুলির জন্য দেখায় । তারপরে বুলিয়ান সূচকগুলি সীমান্ত পয়েন্টগুলি সরবরাহ করে।

কাজের উদাহরণ:

a = np.arange(16).reshape((4,4))

print(a)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

borders = get_borders(a)
print(borders)
array([ 0,  1,  2,  3,  4,  7,  8, 11, 12, 13, 14, 15])

তারপরে, np.all(borders==0)আপনাকে পছন্দসই তথ্য দেবে।


দ্রষ্টব্য: এটি এক-মাত্রিক অ্যারেগুলির জন্য বিরতি, যদিও আমি সেগুলি প্রান্তের ক্ষেত্রে বিবেচনা করি। আপনি সম্ভবত সেখানে দুটি প্রশ্ন দুটি পরীক্ষা করেই ভাল আছেন


এটি কেবল সীমানার পরিবর্তে অ্যারের মোট উপাদানগুলির সংখ্যার সমানুপাতিক সময় নেয়। এছাড়াও, এক-মাত্রিক অ্যারেগুলি অপ্রাসঙ্গিক প্রান্তের কেস নয়।
ব্যবহারকারী 2357112

1
এছাড়াও, np.arange(15)15 টি অন্তর্ভুক্ত নয়
ব্যবহারকারী 2357112 23:57

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