3

次の形式のnumpy配列を生成したい:

0.5*[[0, 0], [1, 1], [2, 2], ...]

最終的な配列にdtypeof が必要ですnumpy.float32

これが私の試みです:

>>> import numpy as np
>>> N = 5
>>> x = np.array(np.repeat(0.5*np.arange(N), 2), np.float32)
>>> x
array([ 0. ,  0. ,  0.5,  0.5,  1. ,  1. ,  1.5,  1.5,  2. ,  2. ], dtype=float32)

これは良い方法ですか?型変換のためだけにコピーを避けることはできますか (実際にコピーしている場合)。

4

2 に答える 2

3

必要なものを得るには、最終結果を再形成するだけです。

x = x.reshape(-1, 2)

arange次を渡して実行することもできますdtype

x = np.repeat(0.5*np.arange(N, dtype=np.float32), 2).reshape(-1, 2)

astype引数を受け入れるメソッドを使用して、配列を別の型として簡単にキャストできcopyます。

x.astype(np.int8, copy=False)

ただし、ドキュメントで説明されているnumpyように、ビューを返すためにいくつかの要件をチェックします。これらの要件が満たされない場合は、コピーが返されます。

のプロパティからOWNDATAアクセスできる属性を確認することで、特定の配列が別の配列からのコピーまたはビューであるかどうかを確認できます。flagsndarray


編集:特定の配列がコピーであるかどうかの確認の詳細...

于 2013-11-06T13:39:45.443 に答える
0

別の方法:

 np.array([0.5*np.arange(N, dtype=np.float32)]*2)

与えます:

array([[ 0. ,  0.5,  1. ,  1.5,  2. ],
       [ 0. ,  0.5,  1. ,  1.5,  2. ]], dtype=float32)

あなたはそれを回転させたいかもしれません:

np.rot90(np.array([0.5*np.arange(N, dtype=np.float32)]*2),3)

与える:

array([[ 0. ,  0. ],
       [ 0.5,  0.5],
       [ 1. ,  1. ],
       [ 1.5,  1.5],
       [ 2. ,  2. ]], dtype=float32)

これは@Saullo_Castroの回答よりも遅いことに注意してください。

np.rot90(np.array([0.5*np.arange(N, dtype=np.float32)]*2),3)

10000 loops, best of 3: 24.3us per loop

np.repeat(0.5*np.arange(N, dtype=np.float32), 2).reshape(-1, 2)

10000 loops, best of 3: 9.23 us per loop

np.array(np.repeat(0.5*np.arange(N), 2), np.float32).reshape(-1, 2)

10000 loops, best of 3: 10.4 us per loop

%%timeitipythonで使用)

于 2013-11-06T16:10:58.803 に答える