Numpy의 array () 함수와 asarray () 함수의 차이점은 무엇입니까?


297

Numpy array()asarray()기능 의 차이점은 무엇입니까 ? 언제 다른 것을 사용해야합니까? 그들은 내가 생각할 수있는 모든 입력에 대해 동일한 출력을 생성하는 것 같습니다.

답변:


110

다른 질문은 다른 배열 생성 루틴asanyarray 이나 다른 배열 생성 루틴 에 대한 질문으로 리디렉션되므로 각 질문에 대한 간략한 요약이 필요합니다.

차이점은 주로 새 배열을 복사본으로 만드는 것과 달리 입력을 변경하지 않고 반환하는 시점에 관한 것입니다.

array복사시기를 결정하는 플래그를 포함하여 다양한 옵션 (대부분의 다른 기능은 그 주위에 얇은 래퍼 임)을 제공합니다. 전체 설명은 문서만큼 오래 걸릴 것입니다 ( Array Creation 참조). 간단히 말하면 몇 가지 예가 있습니다.

가정 a입니다 ndarray, 그리고 mA는 matrix, 그들 모두는이 dtype의를 float32:

  • np.array(a)그리고 np.array(m)그 기본 동작이기 때문에, 모두를 복사합니다.
  • np.array(a, copy=False)np.array(m, copy=False)복사 할 m수 없습니다하지만 a때문에, m하지 않습니다 ndarray.
  • np.array(a, copy=False, subok=True)하고 np.array(m, copy=False, subok=True)있기 때문에, 복사하지 둘 것이다 mA는 matrix의 서브 클래스 인 ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)dtype호환되지 않기 때문에 둘 다 복사합니다 .

다른 함수의 대부분은 array복사가 발생할 때 해당 컨트롤을 둘러싼 얇은 래퍼 입니다.

  • asarray: 호환되는 경우 입력이 복사되지 않은 상태로 반환됩니다 ndarray( copy=False).
  • asanyarray: 입력이 ( , ) ndarray와 같은 호환 가능 하거나 하위 클래스 인 경우 복사되지 않은 상태로 반환됩니다 .matrixcopy=Falsesubok=True
  • ascontiguousarray: ndarray연속 된 C 순서 ( copy=False,) 와 호환되는 경우 입력이 복사되지 않은 상태로 반환됩니다 order='C').
  • asfortranarray: 입력이 ndarray연속 포트란 순서 ( copy=False, order='F') 와 호환되는 경우 복사되지 않은 상태로 반환됩니다 .
  • require: 지정된 요구 사항 문자열과 호환되는 경우 입력이 복사되지 않은 상태로 리턴됩니다.
  • copy: 입력이 항상 복사됩니다.
  • fromiter: 입력은 반복 가능한 것으로 취급됩니다 (예를 들어, 반복자가있는 배열 대신 반복자의 요소로 배열을 구성 할 수 있습니다 object). 항상 복사했습니다.

asarray_chkfinite(와 같은 복사 규칙이 asarray있지만 값 ValueError이있는 nan경우 발생 inf합니다) 와 같은 편리한 함수 matrix와 레코드 배열과 같은 특수한 경우에 대한 하위 클래스 생성자 와 실제 ndarray생성자 (배열을 직접 만들 수 있음) 버퍼를 통한 보폭).


감사합니다. 매우 도움이됩니다
Kris

234

의 정의asarray 이다

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

array옵션이 적다는 점을 제외하고는와 같습니다 copy=False. arraycopy=True기본적으로.

가장 큰 차이점은 array(기본적으로) 객체를 복사하지만 asarray필요한 경우가 아니라면 복사 하지 않습니다.


13
그럼 언제 사용해야합니까? 처음부터 배열, 더 생성하는 경우 array([1, 2, 3])또는 asarray([1, 2, 3])?
endolith 2016 년

15
@endolith : [1, 2, 3]는 Python 목록 이므로을 만들려면 데이터 복사본을 만들어야합니다 ndarary. 따라서 np.array대신에 매개 변수를 np.asarray보내는 대신 직접 사용 하십시오 . 이 경우와 같이 복사해야하는 경우는 무시됩니다. IPython 에서 두 가지를 벤치마킹하면 작은 목록의 경우 차이점이 있지만 큰 목록의 경우 거의 중요하지 않습니다. copy=Falsenp.arraycopy=False%timeit
unutbu 2016 년

3
"asarray": 이것을 배열 (인플레 이스)로 취급하십시오. 즉,이리스트 / 어레이에서 뷰를 변경하는 것과 같습니다. "배열": 실제로 이것을 새로운 배열로 변환합니다.
denvar

1
방법은 np.asanyarray?
Lee

3
@Lee : asarray항상을 반환합니다 ndarray. 그것이 전달 된 경우 asanyarray의 하위 클래스를 반환 ndarray합니다. 예를 들어, np.matrix는의 하위 클래스입니다 ndarray. 따라서 np.asanyarray(np.matrix(...))동일한 행렬을 반환하는 반면 np.asarray(np.matrix(...))행렬을로 변환합니다 ndarray.
unutbu

113

차이점은이 예제에서 확인할 수 있습니다.

  1. 행렬을 생성하다

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. numpy.array수정 하는 데 사용 합니다 A. 사본을 수정하기 때문에 작동하지 않습니다

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. numpy.asarray수정 하는 데 사용 합니다 A. A스스로 수정 하고 있기 때문에 효과가 있었습니다.

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

도움이 되었기를 바랍니다!


13

차이점은 array및 문서에 명확하게 언급 되어 asarray있습니다. 차이점은 인수 목록에 있으므로 해당 매개 변수에 따라 함수의 동작입니다.

기능 정의는 다음과 같습니다.

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

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

다음 인수로 전달 될 수있는 것들이다 array하지 asarray 로 문서에 언급 된 :

copy : bool, optional true (기본값)이면 객체가 복사 됩니다. 그렇지 않으면, 사본이 __array__리턴되거나 obj가 중첩 된 시퀀스이거나 다른 요구 사항 (dtype, order 등)을 충족시키기 위해 사본이 필요한 경우에만 사본이 작성됩니다.

subok : bool, 선택적 True경우 하위 클래스가 전달 되고 그렇지 않으면 반환 된 배열이 기본 클래스 배열이됩니다 (기본값).

ndmin : int, optional 결과 배열에 필요한 최소 차원 수를 지정합니다 . 이 요구 사항을 충족하는 데 필요한 모양이 미리 붙습니다.


1

차이점을 보여줄 수있는 간단한 예가 있습니다.

가장 큰 차이점은 배열이 원본 데이터의 복사본을 만들고 다른 객체를 사용하여 원본 배열의 데이터를 수정할 수 있다는 것입니다.

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

배열 (a)의 내용은 그대로 유지되지만 여전히 원래 배열의 내용을 수정하지 않고 다른 객체를 사용하여 데이터에 대한 작업을 수행 할 수 있습니다.


0

asarray(x) 처럼 array(x, copy=False)

다른 작업을 수행하기 전에 배열이 asarray(x)되도록 하려면 사용하십시오 x. 경우 x이미 배열 한 후, 복사는 수행되지 것입니다. 중복 성능 저하가 발생하지 않습니다.

다음은 x먼저 배열로 변환 되도록하는 함수의 예입니다 .

def mysum(x):
    return np.asarray(x).sum()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.