array()
Numpyとasarray()
関数の違いは何ですか?どちらを使用する必要がありますか?それらは、私が考えることができるすべての入力に対して同一の出力を生成するようです。
6 に答える
の定義asarray
は次のとおりです。
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
つまりarray
、オプションが少ないことを除けば、と似ていますcopy=False
。array
デフォルトで持っcopy=True
ています。
主な違いは、array
(デフォルトでは)オブジェクトのコピーを作成しますが、asarray
必要な場合を除いて作成しないことです。
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)
、どちらもコピーしません。m
matrix
ndarray
np.array(a, dtype=int, copy=False, subok=True)
dtype
は互換性がないため、両方をコピーします。
他のほとんどの関数はarray
、コピーが発生したときにそのコントロールを囲む薄いラッパーです。
asarray
:互換性がある場合、入力はコピーされずに返されますndarray
(copy=False
)。asanyarray
:互換性があるか、 (、 )のndarray
ようなサブクラスである場合、入力はコピーされずに返されます。matrix
copy=False
subok=True
ascontiguousarray
ndarray
:入力は、連続するC順序(copy=False
、 。)で互換性がある場合、コピーされずに返されorder='C')
ます。asfortranarray
ndarray
:入力は、連続するFortranの順序(copy=False
、 )で互換性がある場合、コピーされずに返されorder='F'
ます。require
:指定された要件文字列と互換性がある場合、入力はコピーされずに返されます。copy
:入力は常にコピーされます。fromiter
:入力はイテレータとして扱われます(たとえば、イテレータを使用したobject
配列の代わりに、イテレータの要素から配列を作成できます)。常にコピーされます。
asarray_chkfinite
(と同じコピールールですが、または値がある場合はasarray
発生します)のような便利な関数、レコード配列のようなまたは特別な場合のサブクラスのコンストラクター、そしてもちろん実際のコンストラクター(配列を直接作成できます)もありますバッファー上のストライドから)。ValueError
nan
inf
matrix
ndarray
この違いは、次の例で示すことができます。
行列を生成する
>>> A = numpy.matrix(numpy.ones((3,3))) >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
numpy.array
を変更するために使用しA
ます。コピーを変更しているため、機能しません>>> numpy.array(A)[2]=2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
numpy.asarray
を変更するために使用しA
ます。A
あなたが自分自身を変更しているので、それはうまくいきました>>> numpy.asarray(A)[2]=2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 2., 2., 2.]])
お役に立てれば!
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結果の配列に必要な次元の最小数を指定します。この要件を満たすために、必要に応じて形状にプリペンディングされます。
asarray(x)
のようなものですarray(x, copy=False)
他の操作を実行する前に、それが配列であることasarray(x)
を確認する場合に使用します。x
がすでに配列である場合x
、コピーは実行されません。冗長なパフォーマンスへの影響は発生しません。
x
これは、最初に配列に変換されることを保証する関数の例です。
def mysum(x):
return np.asarray(x).sum()
違いを示すことができる簡単な例を次に示します。
主な違いは、配列が元のデータのコピーを作成し、別のオブジェクトを使用して元の配列のデータを変更できることです。
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
配列(a)のコンテンツは変更されませんが、元の配列のコンテンツを変更することなく、別のオブジェクトを使用してデータに対して任意の操作を実行できます。