ความแตกต่างระหว่าง ndarray กับ array เป็นจำนวนเท่าใด?


คำตอบ:


220

numpy.arrayเป็นเพียงฟังก์ชั่นอำนวยความสะดวกในการสร้างndarray; มันไม่ได้เป็นคลาสเอง

คุณยังสามารถสร้างอาร์เรย์โดยใช้numpy.ndarrayแต่ไม่ใช่วิธีที่แนะนำ จาก docstring ของnumpy.ndarray:

อาร์เรย์ควรได้รับการสร้างขึ้นโดยใช้array, zerosหรือempty... พารามิเตอร์ให้ที่นี่หมายถึงวิธีการในระดับต่ำ ( ndarray(...)) สำหรับอินสแตนซ์อาร์เรย์

เนื้อสัตว์ส่วนใหญ่ของการนำไปใช้งานนั้นอยู่ในรหัส C ที่นี่ในมัลติเรย์ แต่คุณสามารถเริ่มดูอินเทอร์เฟซของ ndarray ได้ที่นี่:

https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py


1
ฉันคิดว่า array () นำมาใช้ในcore / src / multiarray / methods.cใน array_getarray ()
flxb

6
สิ่งนี้สามารถกัดคุณได้หากคุณลืมnp.arrayว่าไม่ได้เป็นคลาสอย่างที่ฉันมักจะทำ x = np.array([1,2.1,3]) if isinstance(x,np.array): # will give you a TypeError
Steve L

4
ยังไม่มีเงื่อนงำทำไมควรหลีกเลี่ยงการใช้ ndarray เพราะมันเป็นระดับต่ำหรือไม่
GabrielChu

@flxb: ไม่มีคือการดำเนินการของarray_getarray เริ่มต้นที่อย่างน้อยในการใช้งานปัจจุบัน numpy.ndarray.__array__numpy.array_array_fromobject
user2357112 รองรับ Monica

2
เหตุใดจึงไม่แนะนำ
NoName


31

โค้ดตัวอย่างเพียงไม่กี่บรรทัดเพื่อแสดงความแตกต่างระหว่าง numpy.array และ numpy.ndarray

ขั้นตอนการอุ่นเครื่อง: สร้างรายการ

a = [1,2,3]

ตรวจสอบประเภท

print(type(a))

คุณจะได้รับ

<class 'list'>

สร้างอาร์เรย์ (จากรายการ) โดยใช้ np.array

a = np.array(a)

หรือคุณสามารถข้ามขั้นตอนการอุ่นเครื่องได้โดยตรง

a = np.array([1,2,3])

ตรวจสอบประเภท

print(type(a))

คุณจะได้รับ

<class 'numpy.ndarray'>

ซึ่งบอกประเภทของอาร์เรย์ numpy คือ numpy.ndarray

คุณสามารถตรวจสอบประเภทโดย

isinstance(a, (np.ndarray))

และคุณจะได้รับ

True

หนึ่งในสองบรรทัดต่อไปนี้จะให้ข้อความแสดงข้อผิดพลาดแก่คุณ

np.ndarray(a)                # should be np.array(a)
isinstance(a, (np.array))    # should be isinstance(a, (np.ndarray))

4

numpy.ndarray()เป็นชั้นในขณะที่numpy.array()เป็นวิธีการ / ndarrayฟังก์ชั่นในการสร้าง

ในเอกสารจำนวนมากหากคุณต้องการสร้างอาร์เรย์จากndarrayคลาสคุณสามารถทำได้ด้วย 2 วิธีตามที่ยกมา:

1- ใช้array(), zeros()หรือempty()วิธีการ: อาร์เรย์ควรได้รับการสร้างขึ้นโดยใช้อาร์เรย์ศูนย์หรือเปล่า (โปรดดูที่ส่วนดูเพิ่มเติมด้านล่าง) พารามิเตอร์ที่ให้ไว้ที่นี่อ้างถึงวิธีการระดับต่ำ ( ndarray(…)) สำหรับการสร้างอาร์เรย์

2- จากndarrayคลาสโดยตรง: มีสองโหมดในการสร้างอาร์เรย์โดยใช้__new__: ถ้าบัฟเฟอร์เป็น None ดังนั้นจะใช้เฉพาะรูปร่าง dtype และคำสั่ง หาก buffer เป็นวัตถุที่เปิดเผยอินเตอร์เฟสของบัฟเฟอร์คำหลักทั้งหมดจะถูกตีความ

ตัวอย่างด้านล่างให้อาร์เรย์แบบสุ่มเพราะเราไม่ได้กำหนดค่าบัฟเฟอร์:

np.ndarray(shape=(2,2), dtype=float, order='F', buffer=None)

array([[ -1.13698227e+002,   4.25087011e-303],
       [  2.88528414e-306,   3.27025015e-309]])         #random

อีกตัวอย่างหนึ่งคือการกำหนดวัตถุอาร์เรย์ให้กับตัวอย่างบัฟเฟอร์:

>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])

จากตัวอย่างด้านบนเราสังเกตว่าเราไม่สามารถกำหนดรายการให้กับ "buffer" และเราต้องใช้ numpy.array () เพื่อส่งคืนวัตถุ ndarray สำหรับบัฟเฟอร์

สรุป: ใช้numpy.array()ถ้าคุณต้องการสร้างnumpy.ndarray()วัตถุ "


0

ฉันคิดว่าnp.array()คุณสามารถสร้าง C เช่นเดียวกับที่คุณพูดถึงการสั่งซื้อเมื่อคุณตรวจสอบการใช้np.isfortran()มันบอกว่าเป็นเท็จ แต่np.ndarrray()เมื่อคุณระบุคำสั่งซื้อมันจะสร้างขึ้นตามลำดับที่ให้

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