gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:43 24 4
gpt4 key购买 nike

我有

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

关于python - 将元组数组构建为元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45148460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com