Skip to main content
 首页 » 编程设计

python之将元组数组构建为元素

2025年05月04日22artech

我有

x = np.arange(0, 4, 1) 
y = np.arange(0, 4, 1) 

我要

array([[(0,0), (0,1), (0,2), (0,3)], 
       [(1,0), (1,1), (1,2), (1,3)], 
       [(2,0), (2,1), (2,2), (2,3)], 
       [(3,0), (3,1), (3,2), (3,3)] 
      ]) 

请注意,我希望在最低级别上有元组!这不是三品阵法!这是一个以元组为元素的2级数组!

数字 0 到 3 只是一个例子。在实际情况下,它将是 float 的。之后,我想将这些浮点元组用作工厂函数的参数,该函数生成用对象替换这些元组的对象。

现在的问题是:如何获得这个元组数组?

我调查了 in Numpy, how to zip two 2-D arrays?但这没有用,正如我的评论所揭示的那样。

请您参考如下方法:

array of tuples 可以有多种含义。

两次迭代产生一个嵌套的元组列表:

In [292]: alist = [[(i,j) for j in y] for i in x] 
In [293]: alist 
Out[293]:  
[[(0, 0), (0, 1), (0, 2), (0, 3)], 
 [(1, 0), (1, 1), (1, 2), (1, 3)], 
 [(2, 0), (2, 1), (2, 2), (2, 3)], 
 [(3, 0), (3, 1), (3, 2), (3, 3)]] 

由此创建数组的默认方法会生成包含整数元素的 3d 数组

In [294]: arr=np.array(alist) 
In [295]: arr.dtype 
Out[295]: dtype('int32') 
In [296]: arr.shape 
Out[296]: (4, 4, 2) 
In [297]: arr[0,0] 
Out[297]: array([0, 0]) 

定义一个复合数据类型创建一个结构化数组:

In [298]: arr=np.array(alist,'i,i') 
In [299]: arr.dtype 
Out[299]: dtype([('f0', '<i4'), ('f1', '<i4')]) 
In [300]: arr.shape 
Out[300]: (4, 4) 
In [301]: arr 
Out[301]:  
array([[(0, 0), (0, 1), (0, 2), (0, 3)], 
       [(1, 0), (1, 1), (1, 2), (1, 3)], 
       [(2, 0), (2, 1), (2, 2), (2, 3)], 
       [(3, 0), (3, 1), (3, 2), (3, 3)]], 
      dtype=[('f0', '<i4'), ('f1', '<i4')]) 

arr.tolist() 看起来就像 alist。

这个数组的一个元素不是一个元组,尽管它确实如此显示。我更愿意称它为记录。

In [303]: type(arr[0,0]) 
Out[303]: numpy.void 
In [304]: arr[0,0] 
Out[304]: (0, 0) 

这些记录的 2 个元素是字段,可以通过名称访问,例如arr['f0'], arr['f1'],它们都是二维整数数组。

可以创建一个包含文字元组的对象数组(实际上是指向内存中其他地方的元组的指针:

In [305]: arr = np.empty((4,4),object) 
In [306]: arr 
Out[306]:  
array([[None, None, None, None], 
       [None, None, None, None], 
       [None, None, None, None], 
       [None, None, None, None]], dtype=object) 
In [307]: arr[...]=alist 
In [308]: arr 
Out[308]:  
array([[(0, 0), (0, 1), (0, 2), (0, 3)], 
       [(1, 0), (1, 1), (1, 2), (1, 3)], 
       [(2, 0), (2, 1), (2, 2), (2, 3)], 
       [(3, 0), (3, 1), (3, 2), (3, 3)]], dtype=object) 
In [309]: type(arr[0,0]) 
Out[309]: tuple 

从这些 x,y 变量构造数组的非迭代方法是 meshgrid,它返回 (4,4) 数组的列表。它们可以以匹配 (4,4,2) 数组的方式“堆叠”:

In [322]: I,J = np.meshgrid(x,y,indexing='ij') 
In [323]: np.allclose(np.stack((I,J),axis=2), np.array(alist)) 
Out[323]: True 

我们也可以从这些构造记录数组:

In [327]: arr = np.zeros((4,4),'i,i') 
In [328]: arr['f0']=I 
In [329]: arr['f1']=J