Numpyのarray()関数とasarray()関数の違いは何ですか?


回答:


110

他の質問は、この質問asanyarray他の配列作成ルーチンについて尋ねられる質問にリダイレクトされているので、それぞれの機能について簡単に要約しておく価値があります。

違いは主に、新しい配列をコピーとして作成するのではなく、入力を変更せずに返すタイミングです。

arrayは、コピーするタイミングを決定するフラグを含む、さまざまなオプションを提供します(他のほとんどの機能はその周りの薄いラッパーです)。完全な説明は、ドキュメントと同じくらい長くかかります(配列の作成を参照してください。簡単に言えば、ここにいくつかの例があります:

想定aされndarray、そしてmあり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)ため、どちらもコピーしません。mmatrixndarray
  • np.array(a, dtype=int, copy=False, subok=True)dtype互換性がないため、両方をコピーします。

他のほとんどの関数はarray、コピーが発生したときにそのコントロールを囲む薄いラッパーです。

  • asarray:入力は、互換性がある場合ndarraycopy=False)にコピーされずに返されます。
  • asanyarray:入力は、互換性のある、ndarrayまたはmatrixcopy=Falsesubok=True)のようなサブクラスである場合に、コピーされずに返されます。
  • ascontiguousarray:入力はndarray、連続するC順序(copy=Falseorder='C')
  • asfortranarrayndarray連続したFortran順序(copy=Falseorder='F')で互換性がある場合、入力はコピーされずに返されます。
  • require:指定された要件文字列と互換性がある場合、入力はコピーされずに返されます。
  • copy:入力は常にコピーされます。
  • fromiter:入力は反復可能として扱われます(objectつまり、反復子を持つ配列の代わりに、反復子の要素から配列を作成できます)。常にコピーされます。

そこコンビニエンス機能などもあるasarray_chkfinite(同じコピー規則asarrayが、昇給はValueErrorどんな存在する場合nanまたはinf値)、などサブクラスのコンストラクタmatrixまたはレコードの配列のような特別な場合のためには、もちろん実際のndarrayことができますコンストラクタ(あなたが直接配列を作成しますバッファを超えたストライド)。


それをありがとう、それは非常に役に立ちます
クリス

234

定義asarrayは次のとおりです。

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

したがってarray、オプションが少ないことを除いて、に似ていますcopy=False。デフォルトでarray持っcopy=Trueています。

主な違いは、array(デフォルトでは)オブジェクトのコピーが作成されることですが、asarray必要でない限り作成されません。


13
では、それぞれをいつ使用すればよいですか?優れているスクラッチからの配列を作成する場合、array([1, 2, 3])またはasarray([1, 2, 3])
内部石2014年

15
@endolith:[1, 2, 3]はPythonリストであるため、を作成するにはデータのコピーを作成する必要がありますndarary。したがって、パラメータをに送信np.arrayする代わりに、直接使用します。この場合のようにコピーを作成する必要がある場合、は無視されます。IPythonで2つを使用してベンチマークを行うと、小さなリストで違いが見られますが、大きなリストでどちらを使用するかはほとんど問題になりません。np.asarraycopy=Falsenp.arraycopy=False%timeit
unutbu 2014年

3
"asarray":これを配列(インプレース)として扱います。つまり、このリスト/配列のビューを変更するだけです。"配列":実際にこれを新しい配列に変換します。
デンバー2016年

1
どうnp.asanyarrayですか?
リー

3
@Lee:はasarray常にを返しますndarray。渡されたもののasanyarrayサブクラスを返しndarrayます。たとえばnp.matrix、はのサブクラスですndarray。したがってnp.asanyarray(np.matrix(...))、同じ行列を返しますnp.asarray(np.matrix(...))が、行列をに変換しndarrayます。
unutbu 2016

114

この違いは、次の例で実証できます。

  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

違いは、のドキュメントにはかなり明確に言及されているarrayasarray。違いは引数リストにあり、したがってこれらのパラメーターに応じた関数のアクションにあります。

関数の定義は次のとおりです。

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

そして

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

以下の引数をに渡すことができるものであるarrayいない asarray文書で述べたように:

copy:bool、オプションtrue(デフォルト)の場合、オブジェクトがコピーされます。そうでない場合、コピーが__array__返される場合、objがネストされたシーケンスである場合、または他の要件(dtype、順序など)を満たすためにコピーが必要な場合にのみ、コピーが作成されます。

subok:bool、オプションTrueの場合、サブクラスがパススルーされます。それ以外の場合、返される配列は強制的にベースクラス配列になります(デフォルト)。

ndmin:int、オプション結果の配列に必要な最小次元数を指定します。この要件を満たすために、必要に応じて形状にプリペンドされます。


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.