2014-03-03 75 views
4

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

例如,如何从阵列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]] 

感谢您的帮助!

+3

你可能会用['numpy.tile'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html)和['numpy .repeat'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.repeat.html),但为什么要这么长时间不使用循环? – wflynny

+1

我不明白你的目标格式。为什么'B'的第4行以'1'而不是'2'结尾?如果您使用显式循环发布缓慢版本,这将使我们更容易理解您想要执行的操作。 – amaurea

+0

对不起,这是我的错误,第4-6行应该以2.结尾。已编辑。现在清楚还是你想让我更多地分解它? – user3357979

回答

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]] 
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] 
+0

注意;最后一列在我看来是多余的,所以我添加了另一种产生相同模式的方法;但我不确定它是否适用于所有用例;如果这是某些下游代码的预期数据布局,那么您可能只想将第3列写入与第1列相同的模式。 –