Câu trả lời:
Vì các câu hỏi khác đang được chuyển hướng đến câu hỏi này asanyarray
hoặc về các thói quen tạo mảng khác , có lẽ nên có một bản tóm tắt ngắn gọn về những gì chúng làm.
Sự khác biệt chủ yếu là về thời điểm trả lại đầu vào không thay đổi, trái ngược với việc tạo một mảng mới dưới dạng bản sao.
array
cung cấp nhiều tùy chọn khác nhau (hầu hết các chức năng khác là các hàm bao quanh mỏng), bao gồm các cờ để xác định khi nào cần sao chép. Một lời giải thích đầy đủ sẽ chỉ mất chừng nào các tài liệu (xem Tạo mảng , nhưng ngắn gọn, đây là một số ví dụ:
Giả sử a
là một ndarray
, và m
là một matrix
, và cả hai đều có một dtype
của float32
:
np.array(a)
và np.array(m)
sẽ sao chép cả hai, vì đó là hành vi mặc định.np.array(a, copy=False)
và np.array(m, copy=False)
sẽ sao chép m
nhưng không a
, vì m
không phải là một ndarray
.np.array(a, copy=False, subok=True)
và np.array(m, copy=False, subok=True)
sẽ không sao chép, vì m
là một matrix
, là một lớp con của ndarray
.np.array(a, dtype=int, copy=False, subok=True)
sẽ sao chép cả hai, vì dtype
không tương thích.Hầu hết các chức năng khác là các trình bao bọc mỏng xung quanh array
điều khiển đó khi sao chép xảy ra:
asarray
: Đầu vào sẽ được trả về nếu không tương thích nếu nó tương thích ndarray
( copy=False
).asanyarray
: Đầu vào sẽ được trả về không bị chặn nếu đó là ndarray
lớp tương thích hoặc lớp con như matrix
( copy=False
, subok=True
).ascontiguousarray
: Đầu vào sẽ được trả về nếu không tương thích nếu nó tương thích ndarray
theo thứ tự C liền kề ( copy=False
, order='C')
.asfortranarray
: Đầu vào sẽ được trả về nếu không tương thích nếu nó tương thích ndarray
theo thứ tự Fortran liền kề ( copy=False
, order='F'
).require
: Đầu vào sẽ được trả về nếu không tương thích với chuỗi yêu cầu đã chỉ định.copy
: Đầu vào luôn được sao chép.fromiter
: Đầu vào được coi là một iterable (vì vậy, ví dụ: bạn có thể xây dựng một mảng từ các phần tử của iterator, thay vì một object
mảng với iterator); luôn luôn sao chép.Ngoài ra còn có các hàm tiện lợi, như asarray_chkfinite
(quy tắc sao chép giống như asarray
, nhưng tăng ValueError
nếu có bất kỳ nan
hoặc inf
giá trị nào) và hàm tạo cho các lớp con như matrix
hoặc cho các trường hợp đặc biệt như mảng bản ghi và tất nhiên là hàm tạo thực tế ndarray
(cho phép bạn tạo một mảng trực tiếp ra khỏi sải chân trên một bộ đệm).
Các định nghĩa vềasarray
là:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
Vì vậy, nó là như thế array
, ngoại trừ nó có ít tùy chọn hơn, và copy=False
. array
có copy=True
mặc định
Sự khác biệt chính là array
(theo mặc định) sẽ tạo một bản sao của đối tượng, trong khi asarray
sẽ không trừ khi cần thiết.
array([1, 2, 3])
hay asarray([1, 2, 3])
?
[1, 2, 3]
là danh sách Python, vì vậy phải tạo một bản sao của dữ liệu để tạo ndarary
. Vì vậy, sử dụng np.array
trực tiếp thay vì np.asarray
sẽ gửi copy=False
tham số đến np.array
. Các copy=False
bị bỏ qua nếu một bản sao phải được thực hiện như nó sẽ là trong trường hợp này. Nếu bạn điểm chuẩn hai người sử dụng %timeit
trong IPython, bạn sẽ thấy sự khác biệt cho các danh sách nhỏ, nhưng hầu như không có vấn đề gì bạn sử dụng cho danh sách lớn.
np.asanyarray
?
asarray
luôn trả về một ndarray
. asanyarray
sẽ trả về một lớp con ndarray
nếu đó là những gì đã được truyền cho nó. Ví dụ, an np.matrix
là một lớp con của ndarray
. Vì vậy, np.asanyarray(np.matrix(...))
trả về cùng một ma trận, trong khi np.asarray(np.matrix(...))
chuyển đổi ma trận thành một ndarray
.
Sự khác biệt có thể được chứng minh bằng ví dụ này:
tạo ra một ma trận
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
sử dụng numpy.array
để sửa đổi A
. Không hoạt động vì bạn đang sửa đổi một bản sao
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
sử dụng numpy.asarray
để sửa đổi A
. Nó hoạt động vì bạn đang sửa đổi A
chính nó
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Hi vọng điêu nay co ich!
Sự khác biệt được đề cập khá rõ ràng trong tài liệu của array
và asarray
. Sự khác biệt nằm trong danh sách đối số và do đó hành động của hàm phụ thuộc vào các tham số đó.
Các định nghĩa hàm là:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
và
numpy.asarray(a, dtype=None, order=None)
Các đối số sau đây là các đối số có thể được chuyển qua array
và không asarray
được đề cập trong tài liệu:
copy: bool, tùy chọn Nếu đúng (mặc định), thì đối tượng được sao chép . Mặt khác, một bản sao sẽ chỉ được tạo nếu
__array__
trả về một bản sao, nếu obj là một chuỗi lồng nhau hoặc nếu cần một bản sao để đáp ứng bất kỳ yêu cầu nào khác (dtype, order, v.v.).subok: bool, tùy chọn Nếu True, thì các lớp con sẽ được truyền qua , nếu không thì mảng trả về sẽ bị buộc phải là mảng lớp cơ sở (mặc định).
ndmin: int, tùy chọn Chỉ định số lượng kích thước tối thiểu mà mảng kết quả sẽ có. Những người sẽ được chuẩn bị trước hình dạng khi cần thiết để đáp ứng yêu cầu này.
Đây là một ví dụ đơn giản có thể chứng minh sự khác biệt.
Sự khác biệt chính là mảng sẽ tạo một bản sao của dữ liệu gốc và sử dụng các đối tượng khác nhau, chúng ta có thể sửa đổi dữ liệu trong mảng ban đầu.
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
Các nội dung trong mảng (a), vẫn chưa được xử lý và vẫn có thể thực hiện bất kỳ thao tác nào trên dữ liệu bằng cách sử dụng một đối tượng khác mà không sửa đổi nội dung trong mảng ban đầu.
asarray(x)
giống như array(x, copy=False)
Sử dụng asarray(x)
khi bạn muốn đảm bảo rằng đó x
sẽ là một mảng trước khi thực hiện bất kỳ thao tác nào khác. Nếu x
đã là một mảng thì sẽ không có bản sao nào được thực hiện. Nó sẽ không gây ra một hiệu suất dư thừa.
Dưới đây là một ví dụ về hàm đảm bảo x
được chuyển đổi thành một mảng trước tiên.
def mysum(x):
return np.asarray(x).sum()