ความสัมพันธ์ระหว่าง SciPy และ NumPy


254

SciPy ดูเหมือนจะให้ฟังก์ชั่นส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด [1]) ของ NumPy ในเนมสเปซของตัวเอง ในคำอื่น ๆ ถ้ามีฟังก์ชั่นที่มีชื่อว่ามีความเป็นเกือบแน่นอนnumpy.foo scipy.fooส่วนใหญ่ทั้งสองดูเหมือนจะเหมือนกันทุกครั้งแม้กระทั่งชี้ไปที่วัตถุฟังก์ชั่นเดียวกัน

บางครั้งมันแตกต่างกัน หากต้องการยกตัวอย่างที่เกิดขึ้นเมื่อเร็ว ๆ นี้:

  • numpy.log10เป็นufuncที่ส่งคืนNaNsสำหรับอาร์กิวเมนต์ที่เป็นลบ
  • scipy.log10 ส่งกลับค่าที่ซับซ้อนสำหรับการขัดแย้งเชิงลบและดูเหมือนจะไม่เป็น ufunc

เช่นเดียวกับที่ได้กล่าวเกี่ยวกับlog, log2และlognแต่ไม่ได้เกี่ยวกับlog1p[2]

ในทางกลับกันnumpy.expและscipy.expดูเหมือนจะเป็นชื่อที่แตกต่างกันสำหรับ ufunc เดียวกัน นี้ยังเป็นจริงของและscipy.log1pnumpy.log1p

อีกตัวอย่างหนึ่งคือVSnumpy.linalg.solve scipy.linalg.solveมันคล้ายกัน แต่อย่างหลังมีคุณสมบัติเพิ่มเติมบางอย่างในอดีต

ทำไมการทำสำเนาชัดเจน? ในกรณีนี้คือความหมายที่จะนำเข้าขายส่งของnumpyเข้าไปในscipynamespace ทำไมแตกต่างที่ลึกซึ้งในการทำงานและฟังก์ชั่นที่ขาดหายไป? มีตรรกะครอบคลุมบางอย่างที่จะช่วยขจัดความสับสนหรือไม่?

[1] numpy.min, numpy.max, numpy.absและอีกสองสามคนมีลูกน้องในไม่มีscipynamespace

[2] ทดสอบโดยใช้ NumPy 1.5.1 และ SciPy 0.9.0rc2


7
ผมอ่านในคำตอบที่เพราะall of those functions are available without additionally importing Numpy the intention is for users not to have to know the distinction between the scipy and numpy namespacesตอนนี้ฉันสงสัยเพราะฉันติดตามโพสต์เกี่ยวกับ numpy และ scipy เล็กน้อยและใช้มันเอง และฉันเกือบจะเห็นว่ามีการนำเข้า numpy แยก (เป็น np) ดังนั้นพวกเขาจึงล้มเหลว?
joris

8
มีความแตกต่างบางอย่างระหว่าง SciPy และ numpy เป็นในสิ่งที่ FFT ผมเคยได้กัดโดยปัญหาที่ในที่สุดก็จะติดตามลงไป SciPy และรุ่น numpy ของ rfft กำหนดแตกต่างกัน
Wim

1
FFTs ของ SciPy และ NumPy นั้นแตกต่างกัน SciPy ใช้ไลบรารี Fortran FFTPACK ดังนั้นชื่อ scipy.fftpack NumPy ใช้ไลบรารี C ชื่อ fftpack_lite มันมีฟังก์ชั่นน้อยลงและรองรับความแม่นยำสองเท่าใน NumPy คิดว่า inc ได้ทำการติดตั้ง numpy.fft เพื่อใช้ Intel MKL สำหรับ FFT แทน fftpack_lite
Sturla Molden

7
NumPy เดิมชื่อ scipy.core NumPy และ SciPy เป็นโครงการที่เกี่ยวข้องอย่างใกล้ชิด เหตุผลหลักสำหรับการแยกคือเพื่อให้แน่ใจว่าไลบรารีอาร์เรย์ (NumPy) นั้นมีความเอนเอียงและมีความหมายเนื่องจาก SciPy จำนวนมากไม่จำเป็นเสมอไป นอกจากนี้ยังมีการตัดสินใจในหมู่นักวิทยาศาสตร์ที่จะออกแพคเกจอาเรย์ตัวเลข (MIT) และ numarray (NASA) เพื่อ scipy.core และทำให้มันได้รับชื่อ NumPy SciPy ยังไม่ถึง 1.0 ในขณะที่ NumPy ได้รับการปล่อยตัวในขณะนี้ที่ 1.8.1 NumPy มีสิ่งอำนวยความสะดวกบางอย่างสำหรับ FFT และพีชคณิตเชิงเส้น แต่ไม่ครอบคลุมเท่า SciPy
Sturla Molden

@Stla LaMolden ที่ดีที่จะรู้เกี่ยวกับความคิดคุณรู้หรือไม่ว่า Anaconda เพิ่มประสิทธิภาพทั้งสองหรือเพียงแค่ numpy?
dashesy

คำตอบ:


138

ครั้งล่าสุดที่ฉันตรวจสอบมัน__init__วิธีscipy ดำเนินการ

from numpy import *

เพื่อให้เนมสเปซ numpy ทั้งหมดรวมอยู่ใน scipy เมื่อนำเข้าโมดูล scipy

log10พฤติกรรมที่คุณจะอธิบายเป็นที่น่าสนใจเพราะทั้งสองรุ่นจะมาจาก numpy หนึ่งคือ a ufunc, อื่น ๆ เป็นnumpy.libฟังก์ชั่น ทำไมชาวสก็อตจึงชอบฟังก์ชั่นห้องสมุดมากกว่าufuncฉันไม่รู้จักส่วนบนของหัว


แก้ไข: ที่จริงฉันสามารถตอบlog10คำถามได้ มองใน__init__วิธีscipy ฉันเห็นนี้

# Import numpy symbols to scipy name space
import numpy as _num
from numpy import oldnumeric
from numpy import *
from numpy.random import rand, randn
from numpy.fft import fft, ifft
from numpy.lib.scimath import *

log10ฟังก์ชั่นที่คุณได้รับใน SciPy numpy.lib.scimathมาจาก ดูรหัสนั้นมันบอกว่า:

"""
Wrapper functions to more user-friendly calling of certain math functions
whose output data-type is different than the input data-type in certain
domains of the input.

For example, for functions like log() with branch cuts, the versions in this
module provide the mathematically valid answers in the complex plane:

>>> import math
>>> from numpy.lib import scimath
>>> scimath.log(-math.exp(1)) == (1+1j*math.pi)
True

Similarly, sqrt(), other base logarithms, power() and trig functions are
correctly handled.  See their respective docstrings for specific examples.
"""

ดูเหมือนว่าภาพซ้อนทับโมดูล ufuncs ฐาน numpy สำหรับsqrt, log, log2, logn, log10, power, arccos, และarcsin arctanhนั่นอธิบายพฤติกรรมที่คุณเห็น เหตุผลการออกแบบพื้นฐานว่าทำไมมันถึงทำแบบนั้นอาจถูกฝังอยู่ในรายชื่อผู้รับจดหมายบางแห่ง


10
หลังจากทำงานเต็มเวลากับแพ็คเกจเหล่านี้มาระยะหนึ่งนี่เป็นความรู้สึกที่ฉันได้รับ: NumPy มีความหมายว่าเป็นห้องสมุดสำหรับอาร์เรย์ตัวเลขเพื่อให้ใครก็ตามที่ต้องการวัตถุเช่นนั้นใน Python ใช้ SciPy มีวัตถุประสงค์เพื่อเป็นห้องสมุดสำหรับนักวิทยาศาสตร์ / วิศวกรดังนั้นจึงมีจุดมุ่งหมายสำหรับคณิตศาสตร์เชิงทฤษฎีที่เข้มงวดมากขึ้น ความสับสนหลักมาจากความจริงที่ว่า NumPy ยังคงมีโมดูลย่อยจำนวนมาก (ซึ่งน่าจะเข้าสู่ Scipy) ซึ่งรวมอยู่ในเวลาที่การแบ่งเขตระหว่าง SciPy / NumPy ไม่ชัดเจนเท่าที่เป็นอยู่ในปัจจุบัน
PhilMacKay

@PhilMacKay สวัสดี Phil ฉันอ่านบทความนี้และโพสต์อื่น ๆ ของคุณโดยเฉพาะสำหรับคำถาม numpy / scipy ปี 2556 คำถามของฉันคือถ้าความคิดเห็นของคุณยังคงเป็นปัจจุบันตามที่ระบุไว้ในความคิดเห็นของคุณด้านบน ฉันเห็นผู้โพสต์บอกว่ามีตัวอย่างที่ไม่เทียบเท่าใน scipy และแสดงรายการ abs, max และ min เป็นตัวอย่าง แต่ฉันเข้าใจว่า abs เป็นเพียงนามแฝงสำหรับ numpy.absolute และมี scipy.absolute, scipy.maximum และ scipy .minimum ดังนั้นจากประสบการณ์ของคุณจนถึงตอนนี้คุณจำเป็นต้องนำเข้าจำนวนมากหากคุณต้องการ scipy อยู่แล้ว?
Dan Boschen

@PhilMacKay ดูเหมือนว่าฉันทามติทั่วไปคือการใช้ไลบรารี submodule ของ SciPy สำหรับกรณีการใช้งานที่เกี่ยวข้องจากนั้นสำหรับการดำเนินการ NumPy หลักในการนำเข้า NumPy โดยเฉพาะ (แทนที่จะเป็นระดับสูงสุดของ SciPy ) ด้วยเหตุผลบางอย่างนี้มีการระบุไว้โดยคนอื่นเช่นเดียวกับเอกสาร SciPy ตัวเองเป็นวิธีการเข้ารหัสที่ดีขึ้นและฉันพยายามที่จะเข้าใจว่าทำไมมันถึงมีความสำคัญ ฉันคิดว่ามันเป็นเพราะมันเป็นเรื่องของการประชุมและอ่านง่าย ความคิดเห็นปัจจุบันของคุณคืออะไร?
Dan Boschen

@DanBoschen ณ เดือนพฤศจิกายน 2018 ฉันยังคงยืนแสดงความคิดเห็นของฉันไว้ด้านบน การนำเข้า SciPy เมื่อต้องการเพียง NumPy อาจเป็น overkill เล็กน้อย ในทางกลับกัน NumPy จะถูกนำเข้าเมื่อโหลด SciPy ดังนั้นจึงไม่จำเป็นต้องนำเข้า NumPy เพิ่มเติมจาก SciPy นอกหลักสูตรมีข้อโต้แย้งที่ดีสำหรับการติดตามเอกสารดังนั้นอย่าลังเลที่จะทำสิ่งที่เกี่ยวข้องมากที่สุดในสถานการณ์ของคุณเอง
PhilMacKay

@PhilMacKay ขอบคุณสำหรับการป้อนข้อมูลของคุณ มีความคิดผ่านการเดาของฉันทำไมมันแนะนำให้นำเข้า numpy (แม้ว่าทุกอย่างสามารถทำได้ใน scipy) เป็นเรื่องของการประชุมและดังนั้นจึงสามารถอ่านได้สำหรับรหัสที่ใช้ร่วมกัน หากรหัสเฉพาะ numpy ทั้งหมดถูกผูกไว้กับไลบรารี numpy โดยเฉพาะก็สามารถแตกออกได้ง่ายขึ้นจากการถูกผูกเข้ากับห้องสมุด scipy ขนาดใหญ่ซึ่งรวมถึงมากขึ้นที่อาจไม่จำเป็นเสมอไป ที่กล่าวว่าความคิดของฉัน (สำหรับวิธีการของตัวเอง) คือการนำเข้าจำนวนมากและจากนั้นไม่นำเข้า scipy ระดับบนสุด แต่เพียงนำเข้า subpackages scipy ตามที่ต้องการ
Dan Boschen

52

จากคู่มืออ้างอิง SciPy:

... ฟังก์ชั่น Numpy ทั้งหมดได้ถูกรวมเข้าในscipy เนมสเปซเพื่อให้ฟังก์ชั่นเหล่านั้นทั้งหมดสามารถใช้งานได้โดยไม่ต้องนำเข้า Numpy เพิ่มเติม

จุดประสงค์คือเพื่อให้ผู้ใช้ไม่ต้องทราบความแตกต่างระหว่างscipyและnumpyเนมสเปซ แต่เห็นได้ชัดว่าคุณพบข้อยกเว้น


50

ดูเหมือนว่าจากคำถามที่ถามบ่อยของ SciPyว่าบางฟังก์ชั่นจาก NumPy อยู่ที่นี่เพื่อเหตุผลทางประวัติศาสตร์ในขณะที่ควรอยู่ใน SciPy เท่านั้น:

ความแตกต่างระหว่าง NumPy และ SciPy คืออะไร

ในโลกอุดมคติ NumPy จะไม่มีอะไรนอกจากประเภทข้อมูลอาเรย์และการดำเนินการขั้นพื้นฐานที่สุด: การจัดทำดัชนีการเรียงลำดับการปรับรูปแบบการทำงานขององค์ประกอบทวนเข็มนาฬิกาพื้นฐานและอื่น ๆ รหัสตัวเลขทั้งหมดจะอยู่ใน SciPy อย่างไรก็ตามหนึ่งในเป้าหมายสำคัญของ NumPy ก็คือความเข้ากันได้ดังนั้น NumPy จึงพยายามรักษาคุณลักษณะทั้งหมดที่สนับสนุนโดยรุ่นก่อนหน้าอย่างใดอย่างหนึ่ง ดังนั้น NumPy จึงมีฟังก์ชั่นพีชคณิตเชิงเส้นแม้ว่าสิ่งเหล่านี้จะอยู่ใน SciPy มากกว่า ไม่ว่าในกรณีใด SciPy จะมีโมดูลพีชคณิตเชิงเส้นรุ่นที่มีคุณลักษณะครบถ้วนมากกว่าเช่นเดียวกับอัลกอริธึมเชิงตัวเลขอื่น ๆ อีกมากมาย หากคุณกำลังคำนวณทางวิทยาศาสตร์ด้วย python คุณควรติดตั้งทั้ง NumPy และ SciPy คุณสมบัติใหม่ส่วนใหญ่อยู่ใน SciPy มากกว่า NumPy

ที่อธิบายว่าทำไมข้อเสนอคุณสมบัติเพิ่มเติมบางอย่างมากกว่าscipy.linalg.solvenumpy.linalg.solve

ฉันไม่เห็นคำตอบของ SethMMort สำหรับคำถามที่เกี่ยวข้อง


12

มีความคิดเห็นสั้น ๆ ในตอนท้ายของการแนะนำเอกสารSciPy :

sourceอีกคำสั่งที่เป็นประโยชน์ เมื่อให้ฟังก์ชันที่เขียนใน Python เป็นอาร์กิวเมนต์ฟังก์ชันจะพิมพ์รายการของซอร์สโค้ดสำหรับฟังก์ชันนั้น สิ่งนี้จะเป็นประโยชน์ในการเรียนรู้เกี่ยวกับอัลกอริทึมหรือความเข้าใจในสิ่งที่ฟังก์ชันทำกับอาร์กิวเมนต์ นอกจากนี้อย่าลืมเกี่ยวกับคำสั่ง Python ซึ่งสามารถใช้ดูเนมสเปซของโมดูลหรือแพ็คเกจ

ผมคิดว่านี่จะช่วยให้คนที่มีความรู้เพียงพอของแพ็กเกจทั้งหมดที่เกี่ยวข้องกับการที่จะเลือกกันว่าสิ่งที่แตกต่างระหว่างบาง SciPy และ numpy ฟังก์ชั่น (มันไม่ได้ช่วยฉันด้วยคำถาม log10 ที่ทั้งหมด) แน่นอนว่าฉันไม่มีความรู้นั้น แต่sourceระบุscipy.linalg.solveและnumpy.linalg.solveมีปฏิสัมพันธ์กับ lapack ในรูปแบบที่แตกต่างกัน

Python 2.4.3 (#1, May  5 2011, 18:44:23) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
>>> import scipy
>>> import scipy.linalg
>>> import numpy
>>> scipy.source(scipy.linalg.solve)
In file: /usr/lib64/python2.4/site-packages/scipy/linalg/basic.py

def solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0,
          debug = 0):
    """ solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0) -> x

    Solve a linear system of equations a * x = b for x.

    Inputs:

      a -- An N x N matrix.
      b -- An N x nrhs matrix or N vector.
      sym_pos -- Assume a is symmetric and positive definite.
      lower -- Assume a is lower triangular, otherwise upper one.
               Only used if sym_pos is true.
      overwrite_y - Discard data in y, where y is a or b.

    Outputs:

      x -- The solution to the system a * x = b
    """
    a1, b1 = map(asarray_chkfinite,(a,b))
    if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]:
        raise ValueError, 'expected square matrix'
    if a1.shape[0] != b1.shape[0]:
        raise ValueError, 'incompatible dimensions'
    overwrite_a = overwrite_a or (a1 is not a and not hasattr(a,'__array__'))
    overwrite_b = overwrite_b or (b1 is not b and not hasattr(b,'__array__'))
    if debug:
        print 'solve:overwrite_a=',overwrite_a
        print 'solve:overwrite_b=',overwrite_b
    if sym_pos:
        posv, = get_lapack_funcs(('posv',),(a1,b1))
        c,x,info = posv(a1,b1,
                        lower = lower,
                        overwrite_a=overwrite_a,
                        overwrite_b=overwrite_b)
    else:
        gesv, = get_lapack_funcs(('gesv',),(a1,b1))
        lu,piv,x,info = gesv(a1,b1,
                             overwrite_a=overwrite_a,
                             overwrite_b=overwrite_b)

    if info==0:
        return x
    if info>0:
        raise LinAlgError, "singular matrix"
    raise ValueError,\
          'illegal value in %-th argument of internal gesv|posv'%(-info)

>>> scipy.source(numpy.linalg.solve)
In file: /usr/lib64/python2.4/site-packages/numpy/linalg/linalg.py

def solve(a, b):
    """
    Solve the equation ``a x = b`` for ``x``.

    Parameters
    ----------
    a : array_like, shape (M, M)
        Input equation coefficients.
    b : array_like, shape (M,)
        Equation target values.

    Returns
    -------
    x : array, shape (M,)

    Raises
    ------
    LinAlgError
        If `a` is singular or not square.

    Examples
    --------
    Solve the system of equations ``3 * x0 + x1 = 9`` and ``x0 + 2 * x1 = 8``:

    >>> a = np.array([[3,1], [1,2]])
    >>> b = np.array([9,8])
    >>> x = np.linalg.solve(a, b)
    >>> x
    array([ 2.,  3.])

    Check that the solution is correct:

    >>> (np.dot(a, x) == b).all()
    True

    """
    a, _ = _makearray(a)
    b, wrap = _makearray(b)
    one_eq = len(b.shape) == 1
    if one_eq:
        b = b[:, newaxis]
    _assertRank2(a, b)
    _assertSquareness(a)
    n_eq = a.shape[0]
    n_rhs = b.shape[1]
    if n_eq != b.shape[0]:
        raise LinAlgError, 'Incompatible dimensions'
    t, result_t = _commonType(a, b)
#    lapack_routine = _findLapackRoutine('gesv', t)
    if isComplexType(t):
        lapack_routine = lapack_lite.zgesv
    else:
        lapack_routine = lapack_lite.dgesv
    a, b = _fastCopyAndTranspose(t, a, b)
    pivots = zeros(n_eq, fortran_int)
    results = lapack_routine(n_eq, n_rhs, a, n_eq, pivots, b, n_eq, 0)
    if results['info'] > 0:
        raise LinAlgError, 'Singular matrix'
    if one_eq:
        return wrap(b.ravel().astype(result_t))
    else:
        return wrap(b.transpose().astype(result_t))

นี่เป็นโพสต์แรกของฉันดังนั้นหากฉันควรเปลี่ยนแปลงบางอย่างที่นี่โปรดแจ้งให้เราทราบ


เสื้อคลุมต้นแบบนั้นแตกต่างกันมาก NumPy ใช้เลเยอร์บางที่เขียนใน C. SciPy ใช้เลเยอร์ที่สร้างอัตโนมัติโดย f2py SciPy เชื่อมโยงกับห้องสมุด LAPACK ภายนอกเสมอ NumPy การใช้งานมี f2c'd lapack_lite ของตัวเองในกรณีที่ไม่พบ LAPACK ภายนอก
Sturla Molden

8

จาก Wikipedia ( http://en.wikipedia.org/wiki/NumPy#History ):

รหัสตัวเลขถูกดัดแปลงเพื่อให้สามารถบำรุงรักษาได้และมีความยืดหยุ่นเพียงพอที่จะใช้คุณสมบัติใหม่ของ Numarray โครงการใหม่นี้เป็นส่วนหนึ่งของ SciPy เพื่อหลีกเลี่ยงการติดตั้งแพคเกจทั้งหมดเพียงเพื่อรับวัตถุอาร์เรย์แพคเกจใหม่นี้ถูกแยกออกและเรียกว่า NumPy

scipyขึ้นอยู่กับnumpyการนำเข้าnumpyฟังก์ชั่นมากมายในเนมสเปซของมันเพื่อความสะดวก


4

เกี่ยวกับแพ็คเกจ linalg - ฟังก์ชั่น scipy จะเรียกว่า lapack และ blas ซึ่งมีอยู่ในเวอร์ชั่นที่ได้รับการปรับให้เหมาะสมที่สุดในหลาย ๆ แพลตฟอร์มและให้ประสิทธิภาพที่ดีมากโดยเฉพาะอย่างยิ่งสำหรับการปฏิบัติการกับเมทริกซ์หนาแน่น ในทางกลับกันพวกเขาไม่ใช่ห้องสมุดที่ง่ายต่อการรวบรวมต้องการคอมไพเลอร์ Fortran และปรับแต่งแพลตฟอร์มจำนวนมากเพื่อให้ได้ประสิทธิภาพเต็ม ดังนั้น numpy จึงมีการใช้งานที่ง่ายของฟังก์ชันพีชคณิตเชิงเส้นทั่วไปซึ่งมักจะดีพอสำหรับวัตถุประสงค์หลายอย่าง


numpy 1.10 มีโมดูลที่ดีdual: "โมดูลนี้ควรใช้สำหรับฟังก์ชั่นทั้งในแบบ numpy และ scipy หากคุณต้องการใช้เวอร์ชัน numpy ถ้ามี แต่รุ่น scipy เป็นอย่างอื่น" การใช้งาน ---from numpy.dual import fft, inv
ปฏิเสธตั้งแต่

1

จากการบรรยายเรื่อง ' เศรษฐศาสตร์เชิงปริมาณ '

SciPy เป็นแพคเกจที่ประกอบด้วยเครื่องมือต่าง ๆ ที่สร้างขึ้นบน NumPy โดยใช้ชนิดข้อมูลอาร์เรย์และฟังก์ชันการทำงานที่เกี่ยวข้อง

ในความเป็นจริงเมื่อเรานำเข้า SciPy เราก็จะได้รับ NumPy ดังที่เห็นได้จากไฟล์เริ่มต้น SciPy

# Import numpy symbols to scipy name space
import numpy as _num
linalg = None
from numpy import *
from numpy.random import rand, randn
from numpy.fft import fft, ifft
from numpy.lib.scimath import *

__all__  = []
__all__ += _num.__all__
__all__ += ['randn', 'rand', 'fft', 'ifft']

del _num
# Remove the linalg imported from numpy so that the scipy.linalg package can be
# imported.
del linalg
__all__.remove('linalg')

อย่างไรก็ตามมันเป็นเรื่องธรรมดาและเป็นแนวปฏิบัติที่ดีกว่าในการใช้ฟังก์ชัน NumPy อย่างชัดเจน

import numpy as np

a = np.identity(3)

สิ่งที่มีประโยชน์ใน SciPy คือการทำงานในแพ็คเกจย่อย

  • scipy.optimize, scipy.integrate, scipy.stats เป็นต้น

1
ฉันเห็นความคิดเห็นของคุณว่าเป็นวิธีปฏิบัติที่ดีกว่าในการใช้ฟังก์ชั่น NumPy อย่างชัดเจนและฉันเห็นสิ่งนี้สะท้อนไปที่อื่นรวมถึงในการสอน SciPy แต่ทำไมการฝึกฝนแบบนี้ถึงดีกว่า? ดูเหมือนว่าไม่มีใครตอบ หากคุณกำลังนำเข้า SciPy อยู่แล้วและมีฟังก์ชัน NumPy อยู่ทำไมจะดีกว่าที่จะนำเข้า NumPy เมื่อเรานำเข้าแพคเกจย่อยใน SciPy เราจะไม่นำเข้าระดับสูงสุดดังนั้นแทนที่จะทำตามขั้นตอนเพื่อนำเข้า SciPy โดยเฉพาะเราควรนำเข้า Numpy สำหรับฟังก์ชั่นการประมวลผลอาเรย์แกนหลักเหล่านั้นหรือไม่
Dan Boschen

1

นอกเหนือจากคำถามที่พบบ่อย SciPyอธิบายการทำซ้ำเป็นส่วนใหญ่สำหรับความเข้ากันได้ย้อนหลังก็มีการชี้แจงเพิ่มเติมในเอกสาร NumPy ที่จะกล่าวว่า

ตัวเลือก SciPy- เร่งงานประจำ (numpy.dual)

นามแฝงสำหรับฟังก์ชั่นซึ่งอาจถูกเร่งโดย Scipy

SciPy สามารถสร้างขึ้นเพื่อใช้ไลบรารีเร่งความเร็วหรือปรับปรุงเป็นอย่างอื่นสำหรับ FFTs พีชคณิตเชิงเส้นและฟังก์ชั่นพิเศษ โมดูลนี้ช่วยให้นักพัฒนาสามารถสนับสนุนฟังก์ชั่นเร่งความเร็วเหล่านี้เมื่อ SciPy พร้อมใช้งาน แต่ยังคงสนับสนุนผู้ใช้ที่ติดตั้ง NumPy เท่านั้น

สำหรับช่วงเวลาสั้น ๆ เหล่านี้คือ:

  • พีชคณิตเชิงเส้น
  • FFT
  • ฟังก์ชัน Modified Bessel ของประเภทแรกสั่ง 0

นอกจากนี้จากการสอน SciPy :

ระดับสูงสุดของ SciPy ยังมีฟังก์ชั่นจาก NumPy และ numpy.lib.scimath อย่างไรก็ตามควรใช้โดยตรงจากโมดูล NumPy แทน

ดังนั้นสำหรับแอปพลิเคชั่นใหม่คุณควรเลือกรุ่น NumPy ของการดำเนินการอาร์เรย์ที่ทำซ้ำในระดับสูงสุดของ SciPy สำหรับโดเมนที่ระบุไว้ข้างต้นคุณควรเลือกโดเมนใน SciPy และตรวจสอบความเข้ากันได้แบบย้อนหลังหากจำเป็นใน NumPy

จากประสบการณ์ส่วนตัวของฉันฟังก์ชั่นอาร์เรย์ส่วนใหญ่ที่ฉันใช้มีอยู่ในระดับสูงสุดของ NumPy (ยกเว้นrandom) อย่างไรก็ตามรูทีนเฉพาะโดเมนทั้งหมดมีอยู่ในแพ็คเกจย่อยของ SciPy ดังนั้นฉันจึงไม่ค่อยใช้อะไรจาก SciPy ระดับสูงสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.