3

約 40 次元の約 50 万エントリのレコード配列があります。次元はデータ型の混合です。5つのブール次元をサブ選択し、約1kエントリのブロックを取得してから、共分散行列を計算して次元の相関を確認したいと思います。この変換の使用方法.view()または実行方法に完全に行き詰まっています。.astype()最初のサブセレクション:

p_new[['no_gender', 'no_age', 'no_income', 'no_politics', 'no_edu']]
array([(False, False, True, False, False), (True, True, False, True, True),
       (True, True, False, True, True), ...,
       (True, True, True, True, True), (True, True, True, True, True),
       (True, True, True, True, True)], 
      dtype=[('no_gender', '|b1'), ('no_age', '|b1'), ('no_income', '|b1'), ('no_politics', '|b1'), ('no_edu', '|b1')])

私の変換の試みはすべて、私の 5 つの次元を 1に縮小します (望ましくない! (1000,5) dtype=np.bool) 。(1000,5) dtype=np.int32(1000,1) dtype=np.int32

4

4 に答える 4

1

再配列では、各レコードが単一の要素として扱われることに注意してください。つまり、次の配列の場合、形状は(3、5)ではなく(3、)です。

A = np.array([('joe', 44, True, True, False),
              ('jill', 22, False, False, False),
              ('Jack', 21, True, False, True)],
             dtype=[['name', 'S4'], ['age', int], ['x', bool],
                    ['y', bool], ['z', bool]])
print A.shape
# (3,)

あなたが求めていることを行う最も簡単な方法は、おそらく次のようなものです。

tmp = [A[field] for field in ['x', 'y', 'z']]
tmp = np.array(tmp, dtype=int)

ビューを使用できる場合もありますが、データ型が混在する配列にビューを使用すると、多少注意が必要になる場合があります。

于 2012-12-10T19:22:03.080 に答える
1

あなたの問題は、タイプを変更するときに行全体を操作することだと思います。bool の配列として表示すると、すべての値を取得してからastype. ただし、形を変えなければなりません。

pnew.view("bool").astype(int).reshape(len(pnew),-1)

の方が使いやすいですが、より多くのメモリを使用し.tolist()、遅くなる可能性があります。

asarray(pnew.tolist()).astype(int)
于 2012-12-10T17:59:27.320 に答える
1

新しいdtypeを作成してから使用できますa.astype(new_dtype)

In [44]: a
Out[44]: 
array([(False, False, True, False, False), (True, True, False, True, True),
       (True, True, False, True, True), (True, True, True, True, True),
       (True, True, True, True, True), (True, True, True, True, True)], 
      dtype=[('no_gender', '|b1'), ('no_age', '|b1'), 
             ('no_income', '|b1'), ('no_politics', '|b1'), ('no_edu', '|b1')])

In [45]: new_dtype = np.dtype([(name, np.int) for name in a.dtype.names])

In [46]: a.astype(new_dtype)
Out[46]: 
array([(0, 0, 1, 0, 0), (1, 1, 0, 1, 1), (1, 1, 0, 1, 1), (1, 1, 1, 1, 1),
       (1, 1, 1, 1, 1), (1, 1, 1, 1, 1)], 
      dtype=[('no_gender', '<i8'), ('no_age', '<i8'), ('no_income', '<i8'),
             ('no_politics', '<i8'), ('no_edu', '<i8')])
于 2012-12-11T06:27:37.357 に答える
1

実際にブール値を整数に変換する必要はまったくありません。Python では、TrueFalseは実際には のサブクラスでintあるため、すべての数学演算を通常どおり簡単に行うことができます。 Trueです。1_ False_0

証拠:

>>> isinstance(True, int)
True
>>> isinstance(False, int)
True
>>> (True + True * 3) / (True + False)
4

numpy認めますが、データ型と、それがあなたがやろうとしていることとどのように関係するかについて、100% 確信があるわけではありません。

アップデート

numpyデータ型をもう少し調べて みると、それらは似たような動作を示しているように見えますが、同一ではありません。numpy.boolは文字通り と同じですbool。これは単なる標準の Python ブール値であるため、まったく同じ動作を示し、整数として使用できます。ただし、numpy.int32は から個別にサブクラス化されるintため、isinstance(numpy.bool(1), numpy.int32)当然 に評価されFalseます。int/に直行するだけでトラブルが減るかもしれませんnumpy.int

于 2012-12-10T17:38:27.063 に答える