2012-12-05 7 views
15

配列に文字列データが含まれていると、numpyのような面倒な問題が発生しています。私は次のコードを持っている:私はprint my_array[0, :]でそれを印刷するとき、今すぐnumpy配列の文字列データを初期化する奇妙な振る舞い

my_array = numpy.empty([1, 2], dtype = str) 
my_array[0, 0] = "Cat" 
my_array[0, 1] = "Apple" 

を、私が得る応答は明らかに猫とアップルの期待出力されない、['C', 'A']です。それはなぜですか、そして、どうすれば正しい出力を得ることができますか?

ありがとうございます!

答えて

28

Numpyは文字列配列の最大長を固定する必要があります。 dtype=strで空の配列を作成すると、デフォルトでこの最大長が1に設定されます。 my_array.dtypeかどうかを確認できます。 "| S1"、つまり "1文字の文字列"が表示されます。配列への後続の割り当ては、この構造に適合するように切り捨てられます。

あなたは、実行して、最大の長さで例えばを明示的なデータ型を渡すことができます。:

my_array = numpy.empty([1, 2], dtype="S10") 

「S10」は、長さ10文字列の配列を作成します。あなたは、保持したいすべてのデータを保持するのに十分な大きさの大きさを決める必要があります。

+0

これは間違いなく、知っておいてよかったです!ありがとう – Jim

+0

リストの要素を更新すると(つまり、my_array [0] = 'hello'')、その最初の要素にはまだ "10文字分の"メモリが割り当てられていますか?それとも本当に「S5」のオブジェクトですか? 'numpy'配列の' dtype'は配列全体で一貫していなければならないので、私は仮定しません。 – Anonymous

+0

@jphollowed:右は、配列全体のサイズが固定されているため、S10として初期化すると、格納する実際の文字列が小さい場合でも各エントリに10バイトを使います。 – BrenBarn

2

私はあなたがまた私を混乱バイナリ文字列と配列を取得dtype="S10"

で非ASCII文字を使用しようとしたとき、私は「コーデックエラー」を得ました。

私はそれを使用することをお勧めだと思います:

my_array = numpy.empty([1, 2], dtype="<U10")

1

numpyの文字列配列は、その固定長(デフォルトでは長さ1)によって制限されています。あなたは事前に文字列を必要がありますどのような長さがわからない場合は、dtype=objectを使用して、データ要素のための任意の長さの文字列を取得することができます:私はこのアプローチには、効率の欠点があるかもしれません理解

my_array = numpy.empty([1, 2], dtype=object) 

が、私はそれをサポートするための良いリファレンスがありません。言い換えれば

my_array = np.array([["CAT","APPLE"],['','']], dtype=str) 

は、まずあなたが、あなたがnumpyの配列にそれを回す、あなたは何をしたいとの定期的な配列を記述します。

+0

「S10」と比べて(遅いスピードのような)注意点はありますか? – Boern

0

別の方法は、次のように初期化することです。ただし、初期化時に最大文字列長を最長文字列の長さに修正します。したがって、追加する場合は、

my_array[1,0] = 'PINEAPPLE' 

となります。格納される文字列は「PINEA」になります。