2017-08-27 94 views
1

好吧,这里给出的数据; 形状有三个numpy阵列: (i,4,2),(i,4,3),(i,4,2) i在它们之间共享,但是是可变的。 dtype是float32的一切。 目标是按特定顺序交织它们。让我们看一下数据索引0对于这些阵列:Numpy交织异形阵列

[[-208. -16.] 
[-192. -16.] 
[-192. 0.] 
[-208. 0.]] 

[[ 1. 1. 1.] 
[ 1. 1. 1.] 
[ 1. 1. 1.] 
[ 1. 1. 1.]] 

[[ 0.49609375 0.984375 ] 
[ 0.25390625 0.984375 ] 
[ 0.25390625 0.015625 ] 
[ 0.49609375 0.015625 ]] 

在这种情况下,concatened目标阵列会是这个样子:

[-208, -16, 1, 1, 1, 0.496, 0.984, -192, -16, 1, 1, 1, ...] 

然后继续与索引1

我不知道如何实现这一点,因为连接函数只是告诉我形状不匹配。目标数组的形状并不重要,只是它的内存视图必须按照给定顺序才能上传到GPU着色器。

编辑:我可以用几个python for循环来实现,但是性能影响会成为这个程序中的一个问题。

回答

2

使用np.dstack和扁平化与np.ravel() -

np.dstack((a,b,c)).ravel() 

现在,np.dstack基本上沿着第三轴堆叠。所以,我们也可以使用np.concatenate沿轴过,像这样 -

np.concatenate((a,b,c),axis=2).ravel() 

采样运行 -

1)设置输入数组:

In [613]: np.random.seed(1234) 
    ...: n = 3 
    ...: m = 2 
    ...: a = np.random.randint(0,9,(n,m,2)) 
    ...: b = np.random.randint(11,99,(n,m,2)) 
    ...: c = np.random.randint(101,999,(n,m,2)) 
    ...: 

2)检查输入值:

In [614]: a 
Out[614]: 
array([[[3, 6], 
     [5, 4]], 

     [[8, 1], 
     [7, 6]], 

     [[8, 0], 
     [5, 0]]]) 

In [615]: b 
Out[615]: 
array([[[84, 58], 
     [61, 87]], 

     [[48, 45], 
     [49, 78]], 

     [[22, 11], 
     [86, 91]]]) 

In [616]: c 
Out[616]: 
array([[[104, 359], 
     [376, 560]], 

     [[472, 720], 
     [566, 115]], 

     [[344, 556], 
     [929, 591]]]) 

3)输出:

In [617]: np.dstack((a,b,c)).ravel() 
Out[617]: 
array([ 3, 6, 84, 58, 104, 359, 5, 4, 61, 87, 376, 560, 8, 
     1, 48, 45, 472, 720, 7, 6, 49, 78, 566, 115, 8, 0, 
     22, 11, 344, 556, 5, 0, 86, 91, 929, 591]) 
+0

这个工作。你的示例形状稍微偏离了一点,但它确实有效。 谢谢! – Berserker

+0

@Berserker Yeah'm = 4'对于你的情况,但是这样会产生巨大的数组,这对于样本运行来说太多的数据,所以缩短了它:) – Divakar

+0

我更多地提到“b”的形状在第三轴不是3。 – Berserker

0

我会做的是:

np.hstack([a, b, c]).flatten()

假设,b,c是三个数组