Sự khác biệt giữa các hàm Numpy () và asarray () là gì?


298

Sự khác biệt giữa Numpy array()asarray()chức năng là gì? Khi nào bạn nên sử dụng cái này chứ không phải cái kia? Chúng dường như tạo ra đầu ra giống hệt nhau cho tất cả các đầu vào mà tôi có thể nghĩ ra.

Câu trả lời:


110

Vì các câu hỏi khác đang được chuyển hướng đến câu hỏi này asanyarrayhoặ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.

arraycung 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ử alà một ndarray, và mlà một matrix, và cả hai đều có một dtypecủa float32:

  • np.array(a)np.array(m)sẽ sao chép cả hai, vì đó là hành vi mặc định.
  • np.array(a, copy=False)np.array(m, copy=False)sẽ sao chép mnhưng không a, vì mkhông phải là một ndarray.
  • np.array(a, copy=False, subok=True)np.array(m, copy=False, subok=True)sẽ không sao chép, vì mlà 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ì dtypekhô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à ndarraylớ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 ndarraytheo 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 ndarraytheo 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 objectmả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 ValueErrornếu có bất kỳ nanhoặc infgiá trị nào) và hàm tạo cho các lớp con như matrixhoặ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ảm ơn vì điều đó, nó rất hữu ích
Kris

234

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. arraycopy=Truemặ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 asarraysẽ không trừ khi cần thiết.


13
Vậy khi nào chúng ta nên sử dụng mỗi? Nếu tạo một mảng từ đầu, cái nào tốt hơn, array([1, 2, 3])hay asarray([1, 2, 3])?
endolith

15
@endolith: [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.arraytrực tiếp thay vì np.asarraysẽ gửi copy=Falsetham số đến np.array. Các copy=Falsebị 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 %timeittrong 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.
unutbu

3
Điều đó cũng có ý nghĩa đối với các tên phương thức: "asarray": Hãy coi đây là một mảng (tại chỗ), tức là bạn chỉ thay đổi quan điểm của mình về danh sách / mảng này. "mảng": Thực tế chuyển đổi nó thành một mảng mới.
denvar

1
làm thế nào về np.asanyarray?
Lee

3
@Lee: asarrayluôn trả về một ndarray. asanyarraysẽ trả về một lớp con ndarraynếu đó là những gì đã được truyền cho nó. Ví dụ, an np.matrixlà 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.
unutbu

114

Sự khác biệt có thể được chứng minh bằng ví dụ này:

  1. 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.]])
  2. 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.]])
  3. sử dụng numpy.asarrayđể sửa đổi A. Nó hoạt động vì bạn đang sửa đổi Achí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!


13

Sự khác biệt được đề cập khá rõ ràng trong tài liệu của arrayasarray. 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)

numpy.asarray(a, dtype=None, order=None)

Các đối số sau đây là các đối số có thể được chuyển qua arraykhô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.


1

Đâ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.


0

asarray(x) giống như array(x, copy=False)

Sử dụng asarray(x)khi bạn muốn đảm bảo rằng đó xsẽ 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()
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.