Python Numpy meshgrid保持底层为数组
我想制作一个网格网格,但将底层保留为一个数组 当我这样做时:Python Numpy meshgrid保持底层为数组,python,arrays,numpy,mesh,Python,Arrays,Numpy,Mesh,我想制作一个网格网格,但将底层保留为一个数组 当我这样做时: One = np.array([["1A1","1A2"],["1B1","1B2"]]) Two = np.array([["2A1","2A2"],["2B1","2B2"]]) np.array(np.meshgrid(One, Two)) 我得到: array([[[
One = np.array([["1A1","1A2"],["1B1","1B2"]])
Two = np.array([["2A1","2A2"],["2B1","2B2"]])
np.array(np.meshgrid(One, Two))
我得到:
array([[['1A1', '1A2', '1B1', '1B2'],
['1A1', '1A2', '1B1', '1B2'],
['1A1', '1A2', '1B1', '1B2'],
['1A1', '1A2', '1B1', '1B2']],
[['2A1', '2A1', '2A1', '2A1'],
['2A2', '2A2', '2A2', '2A2'],
['2B1', '2B1', '2B1', '2B1'],
['2B2', '2B2', '2B2', '2B2']]], dtype='<U3')
有没有一个功能或其他方式来实现这一点
编辑:
字符串只是为了让它更容易理解。如果还有其他方法,我会将其用于ints
。以下是我的尝试。
我将您想要的“基本结构”分为四种,分别将meshgrid应用于对,然后将它们全部放在一个数组中:
import numpy as np
one = np.array(["1A1","1A2"])
two = np.array(["1B1","1B2"])
three = np.array(["2A1","2A2"])
four = np.array(["2B1","2B2"])
y = np.array(np.meshgrid(one,two))
y_2 = np.array(np.meshgrid(three,four))
y_3 = np.array([y,y_2])
print(y_3, type(y_3))
In [89]: np.stack(_)
Out[89]:
array([[[list(['1A1', '1A2']), list(['1B1', '1B2'])],
[list(['1A1', '1A2']), list(['1B1', '1B2'])]],
[[list(['2A1', '2A2']), list(['2A1', '2A2'])],
[list(['2B1', '2B2']), list(['2B1', '2B2'])]]], dtype=object)
这是输出。我相信这是一个数组,内部元素应该是dtype'您的布局有点不寻常,但这个重复的堆栈似乎可以完成这项工作:
In [79]: np.stack((np.stack((One,One)), np.stack((Two,Two))))
Out[79]:
array([[[['1A1', '1A2'],
['1B1', '1B2']],
[['1A1', '1A2'],
['1B1', '1B2']]],
[[['2A1', '2A2'],
['2B1', '2B2']],
[['2A1', '2A2'],
['2B1', '2B2']]]], dtype='<U3')
[79]中的np.stack((np.stack((一,一)),np.stack((二,二)))
出[79]:
数组(['1A1',1A2'],
[1B1',1B2']],
[1A1',1A2'],
[1B1',1B2']],
[2A1',2A2'],
[2B1',2B2']],
[2A1',2A2'],
['2B1','2B2']]]],dtype='两条评论(@hpaulj,@Richard K Yu)都有一个小错误,但幸运的是他们犯了一个不同的错误,所以我可以合并他们的想法来创建一个解决方案。我的解决方案是:
np.array([np.stack((One,One)),np.array(np.meshgrid(*Two))])
但是,如果有人知道一个更优雅的解决方案,我会非常高兴,因为它目前有点笨拙。另一种方法是使用要作为元素保存在一起的单元制作对象数据类型数组:
In [82]: One_ = np.empty(2,object)
In [84]: One_[:] = One.tolist()
In [85]: One_
Out[85]: array([list(['1A1', '1A2']), list(['1B1', '1B2'])], dtype=object)
In [86]: Two_ = np.empty(2,object)
In [87]: Two_[:] = Two.tolist()
现在,meshgrid
可以将它们组合起来,就像使用数字或字符串数据类型一样:
In [88]: np.meshgrid(One_, Two_)
Out[88]:
[array([[list(['1A1', '1A2']), list(['1B1', '1B2'])],
[list(['1A1', '1A2']), list(['1B1', '1B2'])]], dtype=object),
array([[list(['2A1', '2A2']), list(['2A1', '2A2'])],
[list(['2B1', '2B2']), list(['2B1', '2B2'])]], dtype=object)]
作为一个数组:
import numpy as np
one = np.array(["1A1","1A2"])
two = np.array(["1B1","1B2"])
three = np.array(["2A1","2A2"])
four = np.array(["2B1","2B2"])
y = np.array(np.meshgrid(one,two))
y_2 = np.array(np.meshgrid(three,four))
y_3 = np.array([y,y_2])
print(y_3, type(y_3))
In [89]: np.stack(_)
Out[89]:
array([[[list(['1A1', '1A2']), list(['1B1', '1B2'])],
[list(['1A1', '1A2']), list(['1B1', '1B2'])]],
[[list(['2A1', '2A2']), list(['2A1', '2A2'])],
[list(['2B1', '2B2']), list(['2B1', '2B2'])]]], dtype=object)
并转换回字符串数组:
In [90]: np.array(_.tolist())
Out[90]:
array([[[['1A1', '1A2'],
['1B1', '1B2']],
[['1A1', '1A2'],
['1B1', '1B2']]],
[[['2A1', '2A2'],
['2A1', '2A2']],
[['2B1', '2B2'],
['2B1', '2B2']]]], dtype='<U3')
[90]中的:np.array(u.tolist())
出[90]:
数组(['1A1',1A2'],
[1B1',1B2']],
[1A1',1A2'],
[1B1',1B2']],
[2A1',2A2'],
[2A1',2A2']],
[2B1',2B2'],
['2B1','2B2']]],dtype='meshgrid
确实指出输入是“表示网格坐标的一维数组”这就是为什么我要找一个不会使它变平的函数这是一个很好的建议,但是如果你仔细看,你的第二个堆栈与第一个堆栈的布局相同,meshgrid所做的是翻转第二个堆栈,所以你得到的不是ABAB,而是AABBI专注于匹配的two
需要某种转置。正如我在@hpaulj的评论中所说的,您的顺序错了。在您的示例中,它们都是AABB。让我来解决这个问题谢谢,这正是我想要的