将元组数组构建为元素

Mak*_*e42 1 python numpy

我有

x = np.arange(0, 4, 1)
y = np.arange(0, 4, 1)
Run Code Online (Sandbox Code Playgroud)

而且我要

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)]
      ])
Run Code Online (Sandbox Code Playgroud)

请注意,我想在最低级别上有元组!这不是3年级的数组!这是一个以元组为元素的 2 级数组!

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

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

在 Numpy 中查看,如何压缩两个二维数组?但这不起作用,正如我的评论所揭示的那样。

hpa*_*ulj 6

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)]]
Run Code Online (Sandbox Code Playgroud)

从中创建数组的默认方式会生成一个包含整数元素的 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])
Run Code Online (Sandbox Code Playgroud)

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

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')])
Run Code Online (Sandbox Code Playgroud)

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

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

In [303]: type(arr[0,0])
Out[303]: numpy.void
In [304]: arr[0,0]
Out[304]: (0, 0)
Run Code Online (Sandbox Code Playgroud)

这些记录的 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
Run Code Online (Sandbox Code Playgroud)

从这些 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
Run Code Online (Sandbox Code Playgroud)

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

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