2013-03-14 39 views
5

x2_Kaxs是一个Nx3 numpy列表数组,并且这些列表中的元素会索引到另一个数组中。我想最终得到一个Nx3 numpy的索引元素列表数组。强制numpy保留列表

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

这输出一个(N * 3)X1阵列的numpy阵列。大。这几乎适用于我想要的东西。我需要做的就是重塑它。

x2_Kcids.shape = x2_Kaxs.shape 

这个工程。 x2_Kcids成为nx3阵列的numpy阵列。完善。

除了x2_Kaxs中的所有列表中只有一个元素。然后它将 变成一个Nx3整数数组,并且我的代码需要在管道后面列出一个列表。

我提出的一个解决方案是追加一个虚拟元素,然后弹出它,但这是非常丑陋的。有什么更好的吗?

回答

0

类似@Denis:

if x.ndim == 2: 
    x.shape += (1,) 
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 

,返回具有以下形状:

>>> 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也会尽可能多地尝试numpify您的输入,如果所有列表的长度相同,那么它将一直延伸到单个元素。我认为,最好的办法是预先分配的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 

编辑由于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]) 
+0

@unubtu既然你删除了你的答案,我无耻地复制你的平面阵列在作业的左侧分配给我的答案。不过,必须使用'.ravel()',因为'.flat'给出了奇怪的结果。 – Jaime 2013-03-14 19:33:41