2017-09-08 31 views
2

我有一个包含许多元组的元组。我的主元组中的每个元组都有两个元素 - 第一个元素是一个形状为(700,)的数组,第二个 元素是一个整数。串联元组中的元组

这里是我的元组的小图示:

x =((np.array[3,3,3],1), (np.array[4,4,4],2), (np.array[5,5,5],3)) 

我期待所有的阵列组合成一个大矩阵,所有的整数到一个列向量,其全部放入到一个元组。

所以我的输出应该是这样的:用与形状(3,3)的阵列的第一个元素

y= (np.array([[3,3,3],[4,4,4], [5,5,5]]), np.array([1,2,3])) 

一个元组,并用的形状的第二元件作为一个数组 ( 3)

我假设我们可以使用numpy的堆栈方法之一,但我不能包装我的头 围绕如何访问元组的所有元素来这样做。

谢谢。

+0

因此,输出将是一个3×4规则形阵列,是吗? – Divakar

+0

没有输出将是一个具有两个数组的数组--3x3和3.希望这是有道理的。 – Moondra

+0

你能否写下实际的预期输出,因为你所显示的不是有效的输出。 – Divakar

回答

3
>>> x = ((np.array([3,3,3]),1), (np.array([4,4,4]),2), (np.array([5,5,5]),3)) 
>>> y = (np.array([e for e, _ in x]), np.array([i for _, i in x])) 
(array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]]), array([1, 2, 3])) 

或者,不推导:

>>> map(np.array, zip(*x)) 
[array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]]), array([1, 2, 3])] 
+0

地图在这里出色地工作+1。自从OP将他的例子从列表更改为数组后,我将删除我的答案。 –

+0

'map'的列表理解版本:'[np.array(i)for zip in(* x)]''。关键是'zip(* x)'实际上是一个列表'转置'。 – hpaulj

1

结构化阵列的方法:

首先元组,具有校正的语法:

In [392]: x =((np.array([3,3,3]),1), (np.array([4,4,4]),2), (np.array([5,5,5]),3)) 

输入到结构化阵列是一个列表的元组,每个元组包含一个record的数据:

In [393]: arr=np.array(list(x), np.dtype('3i,i')) 
In [394]: arr 
Out[394]: 
array([([3, 3, 3], 1), ([4, 4, 4], 2), ([5, 5, 5], 3)], 
     dtype=[('f0', '<i4', (3,)), ('f1', '<i4')]) 

访问阵列由字段名称:

In [395]: arr['f0'] 
Out[395]: 
array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]], dtype=int32) 
In [396]: arr['f1'] 
Out[396]: array([1, 2, 3], dtype=int32) 

或作为字段的元组:

In [397]: (arr['f0'], arr['f1']) 
Out[397]: 
(array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]], dtype=int32), array([1, 2, 3], dtype=int32))