Sự khác biệt giữa ndarray và mảng trong numpy là gì?


Câu trả lời:


220

numpy.array chỉ là một chức năng tiện lợi để tạo ra một ndarray ; bản thân nó không phải là một lớp

Bạn cũng có thể tạo một mảng bằng cách sử dụng numpy.ndarray, nhưng đó không phải là cách được đề xuất. Từ chuỗi của numpy.ndarray:

Mảng nên được xây dựng bằng cách sử dụng array, zeroshoặc empty... Các tham số được đưa ra ở đây đề cập đến một phương thức cấp thấp ( ndarray(...)) để khởi tạo một mảng.

Hầu hết phần cốt lõi của việc triển khai là ở mã C, ở đây trong multiarray , nhưng bạn có thể bắt đầu xem xét các giao diện ndarray ở đây:

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


1
Tôi nghĩ rằng mảng () được triển khai trong core / src / multiarray / phương.c trong mảng_getarray ().
flxb

6
Điều này có thể cắn bạn nếu bạn quên rằng đó np.arraykhông phải là một lớp học, như tôi thường làm. x = np.array([1,2.1,3]) if isinstance(x,np.array): # will give you a TypeError
Steve L

4
Vẫn không có manh mối tại sao nên tránh sử dụng ndarray? Coz nó cấp thấp?
GabrielChu

@flxb: Không, array_getarraylà việc thực hiện numpy.ndarray.__array__. numpy.arraybắt đầu tại _array_fromobject, ít nhất là trong việc thực hiện hiện tại.
user2357112 hỗ trợ Monica

2
Vậy tại sao nó không được khuyến khích?
NoName


31

Chỉ cần một vài dòng mã ví dụ để hiển thị sự khác biệt giữa numpy.array và numpy.ndarray

Bước khởi động: Xây dựng danh sách

a = [1,2,3]

Kiểm tra loại

print(type(a))

Bạn sẽ nhận được

<class 'list'>

Xây dựng một mảng (từ một danh sách) bằng cách sử dụng np.array

a = np.array(a)

Hoặc, bạn có thể bỏ qua bước khởi động, trực tiếp có

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

Kiểm tra loại

print(type(a))

Bạn sẽ nhận được

<class 'numpy.ndarray'>

Nó cho bạn biết loại mảng numpy là numpy.ndarray

Bạn cũng có thể kiểm tra loại bằng cách

isinstance(a, (np.ndarray))

và bạn sẽ nhận được

True

Một trong hai dòng sau sẽ cung cấp cho bạn một thông báo lỗi

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

4

numpy.ndarray()là một lớp, trong khi numpy.array()là một phương thức / hàm để tạo ndarray.

Trong các tài liệu numpy nếu bạn muốn tạo một mảng từ ndarraylớp, bạn có thể làm điều đó với 2 cách như được trích dẫn:

1- sử dụng array(), zeros()hoặc empty()các phương pháp: Mảng nên được xây dựng sử dụng mảng, số không đúng hoặc bỏ trống (tham khảo các See Also phần dưới đây). Các tham số được đưa ra ở đây đề cập đến một phương thức mức thấp ( ndarray(…)) để khởi tạo một mảng.

2- từ ndarraylớp trực tiếp: Có hai chế độ tạo mảng bằng cách sử dụng__new__ : Nếu bộ đệm là Không có thì chỉ sử dụng hình dạng, kiểu chữ và thứ tự. Nếu bộ đệm là một đối tượng phơi bày giao diện bộ đệm, thì tất cả các từ khóa sẽ được diễn giải.

Ví dụ dưới đây cung cấp một mảng ngẫu nhiên vì chúng tôi đã không gán giá trị bộ đệm:

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

một ví dụ khác là gán đối tượng mảng cho ví dụ bộ đệm:

>>> 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])

từ ví dụ trên, chúng tôi nhận thấy rằng chúng tôi không thể gán danh sách cho "bộ đệm" và chúng tôi đã phải sử dụng numpy.array () để trả về đối tượng ndarray cho bộ đệm

Kết luận: sử dụng numpy.array()nếu bạn muốn tạo một numpy.ndarray()đối tượng "


0

Tôi nghĩ với np.array()bạn chỉ có thể tạo C như mặc dù bạn đề cập đến thứ tự, khi bạn kiểm tra bằng cách sử dụng np.isfortran()nó nói sai. nhưng với np.ndarrray()khi bạn chỉ định thứ tự nó tạo ra dựa trên thứ tự được cung cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.