শূন্য দ্বারা বিভাজন দিয়ে 0 কীভাবে ফিরে আসবেন


106

আমি অজগরটিতে একটি উপাদান অনুসারে বিভাজন সম্পাদনের চেষ্টা করছি, তবে যদি শূন্যের মুখোমুখি হয় তবে আমার শূন্যের জন্য ভাগফল প্রয়োজন need

উদাহরণ স্বরূপ:

array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])

array1 / array2 # should be np.array([0, 1, 2])

আমি সবসময় আমার ডেটা দিয়ে কেবলমাত্র একটি লুপ ব্যবহার করতে পারতাম, তবে সত্যই নিম্পের অপ্টিমাইজেশানকে কাজে লাগাতে ত্রুটিটিকে উপেক্ষা করার পরিবর্তে শূন্য ত্রুটি দ্বারা বিভাজনে 0 ফিরিয়ে আনতে আমার বিভাজন ফাংশনটি প্রয়োজন।

যদি না আমি কিছু অনুপস্থিত করছি, এটা মনে হয় না numpy.seterr () ত্রুটি উপর মান ফিরে আসতে পারেন। শূন্য ত্রুটি পরিচালনার দ্বারা নিজের বিভাজনটি নির্ধারণ করার সময় আমি কীভাবে নম্পতির মধ্যে থেকে সেরাটি পেতে পারি তার সম্পর্কে অন্য কোনও পরামর্শ আছে?


আমার পাইথন সংস্করণে (পাইথন ২.7.১১ | কন্টিনিউম অ্যানালিটিক্স, ইনক।) এটি হ'ল আউটপুট। একটি সতর্কতা সহ।
রামন মার্টিনেজ

সবচেয়ে সংক্ষিপ্ত সঠিক উত্তর হল stackoverflow.com/a/37977222/2116338
mrplants

উত্তর:


197

Numpy v1.7 + +, আপনি এর জন্য "যেখানে" বিকল্পটি সুবিধা গ্রহণ করতে পারেন ufuncs । আপনি এক লাইনে জিনিসগুলি করতে পারেন এবং আপনাকে এরস্টেট কনটেক্সট ম্যানেজারের সাথে ডিল করতে হবে না।

>>> a = np.array([-1, 0, 1, 2, 3], dtype=float)
>>> b = np.array([ 0, 0, 0, 2, 2], dtype=float)

# If you don't pass `out` the indices where (b == 0) will be uninitialized!
>>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0)
>>> print(c)
[ 0.   0.   0.   1.   1.5]

এই ক্ষেত্রে এটি বিভাজনের গণনা যে কোনও জায়গায় 'বি' শূন্যের সমান হয় না does যখন খ সমান শূন্য করে, তারপরে আপনি আউট আর্গুমেন্টে মূলত যা মান দিয়েছেন তা থেকে এটি অপরিবর্তিত থাকবে।


4
যদি aএবং / অথবা bহতে পারে পূর্ণসংখ্যার অ্যারে, তবে এটি একই ধারণা, আপনার কেবলমাত্র সঠিক আউটপুট প্রকারটি সেট করতে হবে:c = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)
ডিএসটাফম্যান

out=np.zeros_like(a)মন্তব্যাত্মক লাইনে বর্ণিত হিসাবে, সমালোচনাজনক।
জোনাটান Öström

4
আমি যদি ব্যবহার করি তবে আমি np.divide(a, b, out=np.zeros_like(a), where=b!=0)ত্রুটিটি পেয়েছি Assigning to function call which doesn't return। আশ্চর্যের বিষয় হ'ল, আমি এটি দুটিবার ব্যবহার করি এবং ত্রুটিটি কেবল একবার পপ আপ হয়।
জেলমার মুল্ডার

4
যদি কেউ আগ্রহী যেটি দ্রুততর হয় তবে এই পদ্ধতিটি @ ড্যানিস / @ ফ্রাঙ্ক ডারনকোর্টের উত্তরের চেয়ে দ্রুততর, এক মিলিয়ন চক্র চালিয়ে আমি তাদের পক্ষে 11 সেকেন্ডের বিপরীতে 8 সেকেন্ড পাচ্ছি।
Kory

48

@ ফ্র্যাঙ্ক ডারননকোর্টের উত্তরে বিল্ডিং, ফিক্সিং -1 / 0:

def div0( a, b ):
    """ ignore / 0, div0( [-1, 0, 1], 0 ) -> [0, 0, 0] """
    with np.errstate(divide='ignore', invalid='ignore'):
        c = np.true_divide( a, b )
        c[ ~ np.isfinite( c )] = 0  # -inf inf NaN
    return c

div0( [-1, 0, 1], 0 )
array([0, 0, 0])

ধন্যবাদ, আমি @ ফ্র্যাঙ্ক ডারননকোর্টের কোড সহ সেই বাগটিটিও ধরতে পারি নি।
hlin117

হাই, আমি অ্যারে ম্যাথ করার চেষ্টা করছি এবং আমি ০.০-এর ফলাফল 0 পেতে চাই তবে আমি আমার গণনায় এনপি.এন.এন.কেও উপেক্ষা করতে চাই। এটি কি তার জন্য কাজ করবে? এছাড়াও, আমি বুঝতে চেষ্টা করছি। C [~ np.isftimate (c)] = 0 কী করবে? আমি কখনও পাইনি পাইথনে on এটি কিসের জন্যে? আপনাকে ধন্যবাদ
ব্যবহারকারী 20408

@ user20408, ~inverts Trueএবং Falsenumpy বিন্যাসে: print ~ np.array([ True, False, False ])c[ ~ np.isfinite( c )] = 0এর অর্থ: cসীমাবদ্ধ অবস্থানে অবস্থানগুলি সন্ধান করুন , সীমাবদ্ধ ~না হওয়ার জন্য তাদের উল্টো করুন এবং সীমাবদ্ধ মানগুলিকে 0 এ সেট করুন also এছাড়াও স্ট্যাকওভারফ্লোও / সন্ধান?q= পরিবারবর্গ +++ বুলিয়ান+ ইন্ডেক্সিং দেখুন "
ডেনিস

43

অন্যান্য উত্তরের উপর বিল্ডিং, এবং উন্নতি:

  • 0/0যোগ invalid='ignore'করে হ্যান্ডলিংnumpy.errstate()
  • উপস্থাপক numpy.nan_to_num()রূপান্তর করতে np.nanকরতে 0

কোড:

import numpy as np

a = np.array([0,0,1,1,2], dtype='float')
b = np.array([0,1,0,1,3], dtype='float')

with np.errstate(divide='ignore', invalid='ignore'):
    c = np.true_divide(a,b)
    c[c == np.inf] = 0
    c = np.nan_to_num(c)

print('c: {0}'.format(c))

আউটপুট:

c: [ 0.          0.          0.          1.          0.66666667]

4
ত্রুটি 0/0পাশাপাশি পরীক্ষা করার জন্য ভাল কাজ 1/0
hlin117

ডিএসটাউফম্যানের উত্তরে প্রদত্ত উদাহরণ অ্যারে দিয়ে আমি আপনার পদ্ধতিটি চেষ্টা করেছি এবং মনে হচ্ছে এনপি.এন.এফের পরিবর্তে খুব বেশি সংখ্যক ফলাফল এসেছে, যা চূড়ান্ত ফলাফলে রয়ে গেছে
গাল আভিনেরি

আমি এই পদ্ধতিকে নিরুৎসাহিত করব। যদি হয় aবা bথাকে তবে NaNআপনার সমাধান হঠাৎ 0ফলস্বরূপ দেয় । এটি সহজেই আপনার কোডগুলিতে ত্রুটিগুলি আড়াল করতে পারে এবং একেবারে অপ্রত্যাশিত।
ডেরওহ

সাম্প্রতিক অলস ম্যানুয়াল অনুসারে nan_to_num () মানকে ধনাত্মক ইনফ এবং নেতিবাচক ইনফের জন্য বিকল্প হিসাবে গ্রহণ করে। numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)স্বাক্ষর।
ক্রেগ হিক্স


13

এটি দুটি ধাপে করার চেষ্টা করুন। বিভাগ আগে, তারপর প্রতিস্থাপন।

with numpy.errstate(divide='ignore'):
    result = numerator / denominator
    result[denominator == 0] = 0

numpy.errstateলাইন ঐচ্ছিক, এবং শুধুমাত্র বাধা দেয়, শূন্য দ্বারা ভাগ এর "ত্রুটি" সম্পর্কে আপনি কহন থেকে numpy যেহেতু আপনি ইতিমধ্যে তা করার ইচ্ছুক করছি, এবং যে ক্ষেত্রে হ্যান্ডলিং।


4
আপনার সম্ভবত প্রসঙ্গে বিভাগটি সম্পাদন করা উচিতnp.errstate(divide='ignore'):
ওয়ারেন উইক্কেসার

নিবন্ধন করুন প্রসঙ্গ অন্তর্ভুক্ত করার জন্য আমি উত্তরটি সম্পাদনা করেছি। divide='warn'যদি সে এখনও অবহিত হতে চায় তবে তা কার্যকরও হতে পারে।
পাই মেরিলিয়ন

2

আপনি এই উত্তরinf অনুসারে কেবল অ্যারে টাইপগুলি ভাসমান থাকলেও এর উপর ভিত্তি করে প্রতিস্থাপন করতে পারেন :

>>> a = np.array([1,2,3], dtype='float')
>>> b = np.array([0,1,3], dtype='float')
>>> c = a / b
>>> c
array([ inf,   2.,   1.])
>>> c[c == np.inf] = 0
>>> c
array([ 0.,  2.,  1.])

0

একটি উত্তর যা সম্পর্কিত সম্পর্কিত অনুসন্ধান করেছিলাম তা হ'ল শূন্য ছিল কি না তার ভিত্তিতে আউটপুট ম্যানিপুলেট করা।

মনে করুন arrayAএবং arrayBসূচনা করা হয়েছে, তবে arrayBকিছু শূন্য রয়েছে। আমরা arrayC = arrayA / arrayBনিরাপদে গণনা করতে চাইলে আমরা নিম্নলিখিতগুলি করতে পারি ।

এই ক্ষেত্রে, যখনই আমার কোনও একটি ঘরে শূন্যের বিভাজন রয়েছে, আমি ঘরটিকে সমান হিসাবে সেট করেছিলাম myOwnValue, যা এই ক্ষেত্রে শূন্য হবে

myOwnValue = 0
arrayC = np.zeros(arrayA.shape())
indNonZeros = np.where(arrayB != 0)
indZeros = np.where(arrayB = 0)

# division in two steps: first with nonzero cells, and then zero cells
arrayC[indNonZeros] = arrayA[indNonZeros] / arrayB[indNonZeros]
arrayC[indZeros] = myOwnValue # Look at footnote

পাদটীকা: পূর্বানুমতিতে, এই লাইনটি যাইহোক, অপ্রয়োজনীয়, যেহেতু arrayC[i]তাত্ক্ষণিকভাবে শূন্য করা হয়েছে। তবে যদি myOwnValue != 0এমনটি হয় তবে এই অপারেশনটি কিছু করবে।


0

উল্লেখযোগ্য একটি অন্য সমাধান:

>>> a = np.array([1,2,3], dtype='float')
>>> b = np.array([0,1,3], dtype='float')
>>> b_inv = np.array([1/i if i!=0 else 0 for i in b])
>>> a*b_inv
array([0., 2., 1.])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.