numpyのflatten関数とravel関数の違いは何ですか?


292
import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1   2   3   4   5   6   7   8   9]
print(y.ravel())
[1   2   3   4   5   6   7   8   9]

どちらの関数も同じリストを返します。次に、同じジョブを実行する2つの異なる機能の必要性は何ですか。


14
Ravelは通常、既存の配列にビューを返します(コピーが返されることもあります)。Flattenは新しい配列を返します。
Alex


1
ここに微妙な違いの実際のデモンストレーションがあります。
prosti

それで、誰かが配列をフラット化するほうがいいとき、それを解きほぐすときの例を挙げられますか?
Aleksandar

回答:


371

現在のAPIは次のとおりです。

  • flatten 常にコピーを返します。
  • ravel可能な場合は常に、元の配列のビューを返します。これは印刷出力には表示されませんが、ravelから返された配列を変更すると、元の配列のエントリが変更される可能性があります。flattenから返された配列のエントリを変更すると、これは起こりません。メモリーがコピーされないため、ravelの方が高速になることがよくありますが、返される配列の変更についてはより注意する必要があります。
  • reshape((-1,)) たとえ連続した配列を常に取得するとは限らない場合でも、配列のストライドが許可する場合は常にビューを取得します。

30
NumPy開発者がいくつかのパラメーターcopy = [True、False]を持つ1つの関数に固執しなかった理由は何ですか?
フランクDernoncourt 2015年

41
バックコンパクトの保証により、このような奇妙なことが起こることがあります。例:最近の派手な開発者(1.10)は、ravelが連続した配列(C拡張を記述するときに非常に重要なプロパティ)を返すという暗黙の保証を以前に追加したので、APIはa.flatten()確実にコピーを取得しa.ravel()て回避しますほとんどのコピーですが、返される配列が連続していることを保証します。配列a.reshape((-1,))のストライドで許可されている場合は常にビューを取得するため、常に連続した配列が得られるとは限りません。
IanH 2015年

4
@Hossein IanHはそれを説明しました:ravel連続した配列を保証するので、それがビューを返すことは保証されません。reshapeは常にビューを返すため、連続した配列が返されるとは限りません。
2017

4
@Hosseinそれは全く新しい質問でしょう。非常に簡単に言うと、連続したメモリ空間の読み書きがはるかに高速です。ここにはいくつかの質問と回答があります(ここでは良い例です)。他に質問がある場合は、自由に新しい質問を開いてください。
2017

2
reshape(-1)に相当reshape((-1,))
Tom Pohl

53

ここで説明するように、主な違いは次のとおりです。

  • flatten はndarrayオブジェクトのメソッドであるため、真のnumpy配列に対してのみ呼び出すことができます。

  • ravel ライブラリレベルの関数であるため、正常に解析できるすべてのオブジェクトで呼び出すことができます。

たとえばravel、ndarrayのリストで機能しflattenますが、そのタイプのオブジェクトでは使用できません。

@IanHはまた、彼の回答におけるメモリ処理との重要な違いを指摘しています。


4
リストに取り組んでラヴェル(約その情報のためのTHX)ndarrayさん
javadba

配列のリストだけでなく、リストのリストも:)
timtody

15

次に、関数の正しい名前空間を示します。

どちらの関数も、新しいメモリ構造を指すフラット化された1D配列を返します。

import numpy
a = numpy.array([[1,2],[3,4]])

r = numpy.ravel(a)
f = numpy.ndarray.flatten(a)  

print(id(a))
print(id(r))
print(id(f))

print(r)
print(f)

print("\nbase r:", r.base)
print("\nbase f:", f.base)

---returns---
140541099429760
140541099471056
140541099473216

[1 2 3 4]
[1 2 3 4]

base r: [[1 2]
 [3 4]]

base f: None

上の例では:

  • 結果のメモリ位置は異なります
  • 結果は同じに見えます
  • flattenはコピーを返します
  • ravelはビューを返します。

何かがコピーであるかどうかをどのようにチェックしますか?の.base属性を使用しますndarray。ビューの場合、ベースは元の配列になります。コピーの場合、ベースはになりますNone

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.