2013-03-14 11 views
5

x2_KaxsはNx3個のリストの配列であり、これらのリストの要素は別の配列にインデックスを付けます。私はそれらのインデックスされた要素のリストのNx3 numpyの配列で終わりたいです。リストをリストに保つためにnumpyを強制する

これは、numpy配列の(N * 3)x1配列を出力します。すばらしいです。それは私が欲しいもののためにほとんど働く。私がする必要があるのは、それを形作ることだけです。

x2_Kcids.shape = x2_Kaxs.shape 

これは機能します。 x2_Kcidsは、numpy配列のNx3配列になります。完璧。

x2_Kaxsのすべてのリストを除いて、1つの要素しかありません。次に、整数Nx3の配列に を平らにし、私のコードはパイプラインの後のリストを期待しています。

私が思いついた解決策は、ダミー要素を追加してそれをポップすることでしたが、それは非常に醜いです。より良いものはありますか? @Denisと同様に

答えて

0

if x.ndim == 2: 
    x.shape += (1,) 
2

あなたの問題は大きさ1のリストについては、実際にはないが、それはリストと同じ大きさのすべてについてです。私たちはこれらの3にあなたのコードを実行した場合、戻り値は以下の形状を持っている

ax2_cid = np.random.rand(10) 
shape = (10, 3) 

x2_Kaxs = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs.size): 
    x2_Kaxs[j] = [random.randint(0, 9) for k in xrange(random.randint(1, 5))] 
x2_Kaxs.shape = shape 

x2_Kaxs_1 = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs.size): 
    x2_Kaxs_1[j] = [random.randint(0, 9)] 
x2_Kaxs_1.shape = shape 

x2_Kaxs_2 = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs_2.size): 
    x2_Kaxs_2[j] = [random.randint(0, 9) for k in xrange(2)] 
x2_Kaxs_2.shape = shape 

>>> np.array([ax2_cid[axs] for axs in x2_Kaxs.flat], dtype=object).shape 
(30,) 
>>> np.array([ax2_cid[axs] for axs in x2_Kaxs_1.flat], dtype=object).shape 
(30, 1) 
>>> np.array([ax2_cid[axs] for axs in x2_Kaxs_2.flat], dtype=object).shape 
(30, 2) 

となりませんでも、長さ2のすべてのリストを持つ場合、私はこのダミーのサンプルを作成しました(n, 3)にリフォームしましょう。問題は、dtype=objectであっても、numpyはnumfifyの入力を可能な限り試行します。これは、すべてのリストが同じ長さであれば、個々の要素に至るまでです。私はあなたの最善の策は、あなたのx2_Kcids配列を事前に割り当てると思い:unubtuの答えが表示されなくなり

x2_Kcids = np.empty_like(x2_Kaxs).reshape(-1) 
shape = x2_Kaxs.shape 
x2_Kcids[:] = [ax2_cid[axs] for axs in x2_Kaxs.flat] 
x2_Kcids.shape = shape 

EDITので、私は彼から盗むつもりです。単一項目リストの上の例では

x2_Kcids = np.empty_like(x2_Kaxs) 
x2_Kcids.ravel()[:] = [ax2_cid[axs] for axs in x2_Kaxs.flat] 

:上記のコードは、はるかにきれいにしてコンパクトに書かれたようにすることができ

>>> x2_Kcids_1 = np.empty_like(x2_Kaxs_1).reshape(-1) 
>>> x2_Kcids_1[:] = [ax2_cid[axs] for axs in x2_Kaxs_1.flat] 
>>> x2_Kcids_1.shape = shape 
>>> x2_Kcids_1 
array([[[ 0.37685372], [ 0.95328117], [ 0.63840868]], 
     [[ 0.43009678], [ 0.02069558], [ 0.32455781]], 
     [[ 0.32455781], [ 0.37685372], [ 0.09777559]], 
     [[ 0.09777559], [ 0.37685372], [ 0.32455781]], 
     [[ 0.02069558], [ 0.02069558], [ 0.43009678]], 
     [[ 0.32455781], [ 0.63840868], [ 0.37685372]], 
     [[ 0.63840868], [ 0.43009678], [ 0.25532799]], 
     [[ 0.02069558], [ 0.32455781], [ 0.09777559]], 
     [[ 0.43009678], [ 0.37685372], [ 0.63840868]], 
     [[ 0.02069558], [ 0.17876822], [ 0.17876822]]], dtype=object) 
>>> x2_Kcids_1[0, 0] 
array([ 0.37685372]) 
+0

@unubtuあなたはあなたの答えを削除したので、私は臆面もなくコピーしました私の答えを編集する際にあなたの平らな配列の左にある配列。 '.ravel()'は奇妙な結果を出していたので、 '.ravel()'と一緒に行かなければなりませんでした。 – Jaime

関連する問題