Numpy: Enh:オブジェクト配列作成機能

作成日 2015年06月02日  ·  4コメント  ·  ソース: numpy/numpy

問題#5303で説明したように、シーケンスは配列要素として自動的に読み込まれるため、現在、同じ長さのシーケンスを含むオブジェクトdtypeの配列を作成することはできません。 これをリストに対してのみ行うという提案がありますが、これは下位互換性を大幅に損なうことになり、長い非推奨期間が必要になります。

別のアプローチは、オブジェクトdtypeを使用して配列を作成するための関数を明示的に持つことです。 おそらくこれは「objectarray」と呼ばれる可能性があります。 この関数のデフォルトは、シーケンスを取り込んで、シーケンスの各要素を1Dオブジェクト配列の要素と見なすことです。

ただし、関数にはオプションの「ndim」または「depth」引数を含めることができます。これを使用して、配列の一部と見なすシーケンスのレベル数を指定できます。 これはデフォルトで0になります(最も外側のレベルのみが考慮されます)。 寸法が一致しない場合、これにより例外が発生します。

このアプローチは、代替手段と相互に排他的ではありませんが、下位互換性を損なうことがないという利点があることに注意してください。

したがって、たとえば:

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

最も参考になるコメント

何も見逃していないことを願っていますが、 ndmax引数は、報告された問題( "_同じ長さのシーケンスを含むオブジェクトdtypeの配列の作成_")を解決するだけでなく、パフォーマンスの向上ももたらすようです。たとえば、入力の最後のオブジェクトがリストではない(または長さが異なるリストである)場合。 この質問も参照してください。

全てのコメント4件

同じサイズのリストをオブジェクト配列に入れる最も簡単な方法は、次の2つのステップだと思います。

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

おそらくobjectarrayの実装はこのように機能します。

はい、それが現在のところ最善の方法ですが、不必要に冗長です。 したがって、このアイデア。

このアイデアの実装が、 array関数で使用される自動変換をバイパスし、それ自体をndarrayコンストラクターに置き換えることができることを願っています。

何も見逃していないことを願っていますが、 ndmax引数は、報告された問題( "_同じ長さのシーケンスを含むオブジェクトdtypeの配列の作成_")を解決するだけでなく、パフォーマンスの向上ももたらすようです。たとえば、入力の最後のオブジェクトがリストではない(または長さが異なるリストである)場合。 この質問も参照してください。

ndmaxの実装に関する進捗状況、進行中、または計画はありますか? 私が今していること:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
このページは役に立ちましたか?
0 / 5 - 0 評価