50

配列に文字列データが含まれていると、numpyで些細な問題が発生します。私は次のコードを持っています:

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

さて、それをで印刷するとprint my_array[0, :]、私が得る応答はです['C', 'A']。これは明らかに、CatとAppleの期待される出力ではありません。それはなぜですか、そしてどうすれば正しい出力を得ることができますか?

ありがとう!

4

6 に答える 6

68

Numpyでは、文字列配列の最大長が固定されている必要があります。を使用して空の配列を作成するとdtype=str、デフォルトでこの最大長が1に設定されます。あなたがするかどうかを見ることができますmy_array.dtype; 「1文字の文字列」を意味する「|S1」が表示されます。配列への後続の割り当ては、この構造に合うように切り捨てられます。

次のようにすると、最大長の明示的なデータ型を渡すことができます。

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

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

于 2012-12-05T06:40:21.873 に答える
18

非ASCII文字を使用しようとすると「コーデックエラー」が発生しましたdtype="S10"

また、バイナリ文字列を含む配列を取得するため、混乱しました。

私はそれを使用する方が良いと思います:

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

ここで、「U10」は「長さ10のUnicode文字列;リトルエンディアン形式」に変換されます

于 2016-05-23T12:35:38.720 に答える
10

numpy文字列配列は、固定長(デフォルトでは長さ1)によって制限されます。文字列に必要な長さが事前にわからない場合はdtype=object、データ要素に任意の長さの文字列を使用して取得できます。

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

このアプローチには効率上の欠点があるかもしれないことは理解していますが、それをサポートするための適切なリファレンスがありません。

于 2016-08-14T05:57:28.420 に答える
0

別の方法は、次のように初期化することです。

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

つまり、最初に必要なものを使用して通常の配列を作成し、次にそれをnumpy配列に変換します。ただし、これにより、最大文字列長が初期化時の最長文字列の長さに固定されます。したがって、追加する場合

my_array[1,0] = 'PINEAPPLE'

その場合、保存される文字列は「PINEA」になります。

于 2017-07-03T17:19:44.963 に答える
0

forループを実行している場合に最も効果的なのは、リスト内包表記を開始することです。これにより、適切なメモリを割り当てることができます。

data = ['CAT', 'APPLE', 'CARROT']
my_array = [name for name in data]
于 2020-03-29T02:30:07.923 に答える
0

ここで初めての人の場合、今のところこの仕事をする別の方法があると思います。ちょっとした作業が必要です。

my_array = np.full([1, 2], "", dtype=np.object)

np.emptyの代わりにnp.fullを使用し、空の文字列(タイプはオブジェクト)を使用して配列を作成します。

于 2020-12-15T08:28:48.483 に答える