Numpy: خرج غير متوقع من arange مع dtype = int

تم إنشاؤها على ٥ مايو ٢٠٢٠  ·  5تعليقات  ·  مصدر: numpy/numpy


في [3]: np.arange (-3، 0، 0.5، dtype = int)
خارج [3]: صفيف ([- 3 ، -2 ، -1 ، 0 ، 1 ، 2])

حسنًا ، كانت رؤية "1" و "2" أمرًا غير متوقع بعض الشيء بالنسبة إلينا لأن كلا الرقمين أكبر قليلاً من 0.

عادة ، هذه هي النتيجة بدون dtype = int:

In [2]: np.arange(-3, 0, 0.5)                                                  
Out[2]: array([-3. , -2.5, -2. , -1.5, -1. , -0.5])
and we should get this with dtype=int:
In [4]: np.arange(-3, 0, 0.5).astype(int)                                      
Out[4]: array([-3, -2, -2, -1, -1,  0])

ينص الدليل الخالي على:
نوع dtype: نوع dtype
نوع مصفوفة الإخراج. إذا لم يتم توفير dtype ، فاستنتج نوع البيانات من وسيطات الإدخال الأخرى.

وبالتالي يجب أن تؤثر فقط على مجموعة الإخراج ، أليس كذلك؟

import numpy as np
print(np.arange(-3, 0, 0.5))
print(np.arange(-3, 0, 0.5, dtype=int))
print(np.arange(-3, 0, 0.5).astype(int))

رسالة خطأ:

لا توجد رسالة خطأ ...

معلومات إصدار Numpy / Python:

اختبرناها تحت رقم '1.18.4' (Python 3.7.6) بالإضافة إلى 1.18.1 (أناكوندا 3.7 مع تطبيق آخر تحديث). نفس النتيجة.

1.18.4 3.7.6 (افتراضي ، 28 فبراير 2020 ، 15:25:38)
[كلانج 11.0.0 ( https://github.com/llvm/llvm-project.git eefbff0082c5228e01611f7

1.18.1 3.7.4 (افتراضي ، 13 أغسطس 2019 ، 20:35:49)
[مجلس التعاون الخليجي 7.3.0]

00 - Bug numpy.core

التعليق الأكثر فائدة

إن الحصول على قيم أكبر من كلمة "توقف" ليس أمرًا لطيفًا وغير متوقع بعض الشيء. إذا لم يكن arange مخصصًا لـ float ، فيمكنك التحقق من الأنواع العائمة العائمة وإصدار استثناء.

كما يتيح الإدخال اليدوي لـ dtype للمستخدم توقع شيء مثل تحويل نوع (نوع dtype) للمخرج فقط.

ماذا عن:
1.) استثناء للوسيطات غير الصحيحة (مثل البدء ، والتوقف ، والخطوة).
2.) تحقق مما إذا كانت stop> = start ، وإلا قم بإثارة استثناء
3.) Cast start، stop، step to int64 في بداية الوظيفة.
4.) astype (نوع dtype) الإخراج

بدلاً من 1.) يمكنك إعادة التوجيه إلى linspace داخل arange إذا تم العثور على إدخال غير صحيح.

ال 5 كومينتر

يتم الإبلاغ عن مثل هذه الأخطاء مرارًا وتكرارًا. لأسباب ضائعة مع الوقت ، أنا واثق تمامًا من أن تنفيذ arange شيء مثل:

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]

ربما يجب أن نضيف هذا الرمز الزائف إلى الوثائق؟

نعم ، هذا الرمز صحيح (ولكن لست متأكدًا بنسبة 100٪ من حساب n ). هذا المثال المحدد متطرف جدًا ، ومن الواضح أنه معطل ، فربما يمكننا التخلص منه بطريقة ما؟

يتم كره arange مرارًا وتكرارًا بسبب التعريف المكسور القابل للجدل ، لكن لا يمكنني التفكير في اقتراح جيد حقًا لمعالجته (على الرغم من أنه ربما تم طرحه من قبل).
ليس الأمر كما لو أنه يمكننا تغيير سلوك arange للطفو جيدًا (ربما إصلاحات دقيقة ، لكن تغييرات نقطة النهاية ليست IMO جيدة). لذلك سنحتاج إلى إنشاء دالة جديدة ... ولكن بعد ذلك في معظم الحالات يبدو لي أن linspace أفضل من قيمة تعويم "صحيح" ، لست متأكدًا من أن عنصر float-arange المصحح يحتوي بالفعل الكثير من حالات الاستخدام.

في النهاية ، أعتقد أنني أرغب في اقتراح مدروس جيدًا: / ...

إن الحصول على قيم أكبر من كلمة "توقف" ليس أمرًا لطيفًا وغير متوقع بعض الشيء. إذا لم يكن arange مخصصًا لـ float ، فيمكنك التحقق من الأنواع العائمة العائمة وإصدار استثناء.

كما يتيح الإدخال اليدوي لـ dtype للمستخدم توقع شيء مثل تحويل نوع (نوع dtype) للمخرج فقط.

ماذا عن:
1.) استثناء للوسيطات غير الصحيحة (مثل البدء ، والتوقف ، والخطوة).
2.) تحقق مما إذا كانت stop> = start ، وإلا قم بإثارة استثناء
3.) Cast start، stop، step to int64 في بداية الوظيفة.
4.) astype (نوع dtype) الإخراج

بدلاً من 1.) يمكنك إعادة التوجيه إلى linspace داخل arange إذا تم العثور على إدخال غير صحيح.

مرحبًا ، أنا مبتدئ تمامًا في مساهمة المصدر المفتوح. فكرت في إعطائها المحاولة. ماذا عن هذا المقتطف؟ @ eric-wieser

x = []
for i in range(start, stop):
    x.append(i)
    x.append(i+step)
print(np.array(x, dtype))

يتم الإبلاغ عن مثل هذه الأخطاء مرارًا وتكرارًا. لأسباب ضائعة مع الوقت ، أنا واثق تمامًا من أن تنفيذ arange شيء مثل:

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات