6

x2_KaxsはリストのNx3numpy配列であり、これらのリストの要素は別の配列にインデックスを付けます。これらのインデックス付き要素のリストのNx3numpy配列になりたいです。

x2_Kcids = array([ ax2_cid[axs] for axs in x2_Kaxs.flat ], dtype=object)

これにより、numpy配列の(N * 3)x1配列が出力されます。素晴らしい。それはほとんど私が望むもののために働きます。私がする必要があるのはそれを再形成することです。

x2_Kcids.shape = x2_Kaxs.shape

そして、これは機能します。x2_Kcidsnumpy配列のNx3配列になります。完全。

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

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

4

2 に答える 2

2

あなたの問題は実際にはサイズ 1 のリストに関するものではなく、すべて同じサイズのリストに関するものです。このダミーサンプルを作成しました:

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

これら 3 つでコードを実行すると、戻り値は次のような形状になります。

>>> 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 は入力を可能な限りnump 化しようとすることです。これは、個々の要素に至るまでです。あなたの最善の策は、x2_Kcids配列を事前に割り当てることだと思います:

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 unubtuの答えが見えなくなったので、彼から盗みます。上記のコードは、次のように、より適切かつコンパクトに記述できます。

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])
于 2013-03-14T18:14:49.887 に答える
0

@デニスに似ています:

if x.ndim == 2:
    x.shape += (1,)
于 2013-03-14T17:41:16.890 に答える