1

の配列のこの直感に反する動作に気づきましたnumpy。配列にキャストしたいリストのリストがあります。

>>> a = [['abc', 117858348, 117858388, 'def']]

配列にキャストすると、要素が文字列に変換されますが(これで問題ありません)、2つの中央の要素の最後の桁が予期せず削除されます。

>>> array(a)
array([['abc', '11785834', '11785838', 'def']], 
      dtype='|S8')

これの理由は何ですか?この動作をしない方法はありますか?リストのリストを配列にキャストするのが便利な理由は、特定の要素のインデックス作成を高速化するためです。たとえばx、配列へのインデックスのリストがある場合は、それらを取得するためにa行うことができます。a[x]がリストのリストである場合a、それはできませんが、代わりにのようなことをする必要があります[a[i] for i in x]

ありがとう。

4

2 に答える 2

4

オブジェクト配列を使用する場合、切り捨ては行われません。これにより、さまざまなタイプを混在させることもでき、すべてのインデックス作成を納得させることができます。

a = [['abc', 117858348, 117858388, 'def']]
a = array(a, dtype=object)
type(a[0, 0])
# <type str>
type(a[0, 1])
# <type int>
于 2012-08-03T05:20:21.867 に答える
4

さて、これは興味深いですあなたの例を実行すると私にこれを与えます:

>>> numpy.asarray([['abc', 117858348, 117858388, 'def']])
array([['abc', '117', '117', 'def']], 
      dtype='|S3')

変換がどのように機能するかを知りたいと思いました。

>>> help(numpy.asarray)
asarray(a, dtype=None, order=None)
Convert the input to an array.

Parameters
----------
a : array_like
    Input data, in any form that can be converted to an array.  This
    includes lists, lists of tuples, tuples, tuples of tuples, tuples
    of lists and ndarrays.
dtype : data-type, optional
    By default, the data-type is inferred from the input data.

基になるタイプはinferred from the input data、それが何を意味するのか疑問に思うので、

>>> import inspect
>>> print inspect.getsource(numpy.asarray)

取得しますreturn array(a, dtype, copy=False, order=order)が、numpy.array組み込まれているため、 http: //docs.scipy.org/doc/numpy/reference/generated/numpy.array.htmlのドキュメントを確認すると次のようになります。

dtype:データ型、オプション
配列に必要なデータ型。指定しない場合、タイプは、シーケンス内のオブジェクトを保持するために必要な最小タイプとして決定されます。この引数は、配列を「アップキャスト」するためにのみ使用できます。ダウンキャストには、.astype(t)メソッドを使用します。

可能な限りアップキャストされているように見えるので、私の場合は長さ3の文字列にアップキャストされます。これは、シーケンス内で最も長い文字列であるため、より長い文字列を導入すると、それにアップキャストされるようです。他のタイプの桁の長さが適切に考慮されていない場合、これはバグである可能性があります、私にはわかりません...

長い文字列シーケンスを指定するだけで済みます

>>> numpy.asarray([['abc', 117858348, 117858388, 'defs']], dtype = 'S20')
array([['abc', '117858348', '117858388', 'defs']], 
  dtype='|S20')

20文字で十分なようですが、より多くのメモリを消費する可能性があるため、最大値に設定するだけです...

ストアの値を同種の型として伝えることができる限りnumpy、配列を作成するときにすべてが事前に決定された型でなければならないのはこのためです。

>>> numpy.__version__
'1.6.1'

$ python --version
Python 2.6.1

$ uname -a
Darwin 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

これがお役に立てば幸いです。

于 2012-08-03T05:09:29.480 に答える