根据numpy数组中设置的条件创建一个新的numpy数组

时间:2014-03-03 21:05:37

标签: python arrays numpy

如何根据另一个数组中的某些条件创建数组。例如,如果我有一个数组给我一个基数,一个开始和结束数,然后是多个其他基数。我想创建一个新的矩阵,列出基数,循环数(基于开始/结束),然后是与此相关的另一个基数,同时忽略0。我试图找到一种方法来做到这一点,而不使用for循环。

例如,如何从阵列A获取阵列B.

           Base Start End Base1 Base2 Base3
A=np.array([[100,  1,   2,  101,  102,  103],
            [101,  3,   4,  100,  103,    0]])


B=np.array[[100,1,101,1],
           [100,1,102,1],
           [100,1,103,1],
           [100,2,101,2],
           [100,2,102,2],
           [100,2,103,2],
           [101,3,100,3],
           [101,3,103,3],
           [101,4,100,4],
           [101,4,103,4]]

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这里你去......令人讨厌的清单理解

A = array([[100,   1,   2, 101, 102, 103], [101,   3,   4, 100, 103,   0]])
B = [[A[i,0], b, c, b] for i in range(len(A)) for b in A[i,1:3] for c in A[i,3:6] if c != 0]

>>> B
[[100, 1, 101, 1],
 [100, 1, 102, 1],
 [100, 1, 103, 1],
 [100, 2, 101, 2],
 [100, 2, 102, 2],
 [100, 2, 103, 2],
 [101, 3, 100, 3],
 [101, 3, 103, 3],
 [101, 4, 100, 4],
 [101, 4, 103, 4]]

答案 1 :(得分:2)

这里你去:纯粹的numpy,没有for python级别的循环

C = np.empty((len(A), 2,3,4), np.int)
C[...,0] = A[:,0  ][:,None,None]
C[...,1] = A[:,1:3][:,:   ,None]
C[...,2] = A[:,3: ][:,None,:   ]
C[...,3] = np.arange(len(A)*2).reshape(len(A),2,1)+1

C = C.reshape(-1,4)
C = C[C[:,2]!=0]

print C

编辑:小清理

edit2:或者为了最大限度的简洁和神秘感(见评论):

C = np.empty((len(A), 2,3,2,2), np.int)
C[...,0,0] = A[:,0  ][:,None,None]
C[...,1,0] = A[:,3: ][:,None,:   ]
C[...,:,1] = A[:,1:3][:,:   ,None,None]