0

我想制作一个网格,但将底层保留为一个数组。

当我这样做时:

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')

但我不想单独获取所有字符串。我希望基本结构["1A1","1A2"]不被拆分。

基本上,我正在寻找的是一些东西,结果是:

array([[[['1A1', '1A2'],['1B1', '1B2']],
        [['1A1', '1A2'],['1B1', '1B2']]],

       [[['2A1', '2A2'],['2A1', '2A2']],
        [['2B1', '2B2'],['2B1', '2B2']]]], dtype='<U3')

有没有实现它的功能或其他方法?

编辑:字符串只是为了让它更容易理解。ints如果有任何其他方法,我将使用它。

4

3 回答 3

1

另一种方法是使用要作为元素保持在一起的单元来制作对象 dtype 数组:

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可以将它们组合起来,就像使用数字或字符串 dtypes 一样:

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)]

并作为一个数组:

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')

或者使用结构化数组视图对两个字符串进行分组:

In [92]: One.view([('f0','U3',(2,))])                                                                
Out[92]: 
array([[(['1A1', '1A2'],)],
       [(['1B1', '1B2'],)]], dtype=[('f0', '<U3', (2,))])
In [93]: Two.view([('f0','U3',(2,))])                                                                
Out[93]: 
array([[(['2A1', '2A2'],)],
       [(['2B1', '2B2'],)]], dtype=[('f0', '<U3', (2,))])
In [94]: np.meshgrid(_92, _93)                                                                       
Out[94]: 
[array([[(['1A1', '1A2'],), (['1B1', '1B2'],)],
        [(['1A1', '1A2'],), (['1B1', '1B2'],)]],
       dtype=[('f0', '<U3', (2,))]),
 array([[(['2A1', '2A2'],), (['2A1', '2A2'],)],
        [(['2B1', '2B2'],), (['2B1', '2B2'],)]],
       dtype=[('f0', '<U3', (2,))])]
In [95]: np.stack(_)                                                                                 
Out[95]: 
array([[[(['1A1', '1A2'],), (['1B1', '1B2'],)],
        [(['1A1', '1A2'],), (['1B1', '1B2'],)]],

       [[(['2A1', '2A2'],), (['2A1', '2A2'],)],
        [(['2B1', '2B2'],), (['2B1', '2B2'],)]]],
      dtype=[('f0', '<U3', (2,))])
In [96]: import numpy.lib.recfunctions as rf                                                         
In [97]: rf.structured_to_unstructured(_95)                                                          
Out[97]: 
array([[[['1A1', '1A2'],
         ['1B1', '1B2']],

        [['1A1', '1A2'],
         ['1B1', '1B2']]],


       [[['2A1', '2A2'],
         ['2A1', '2A2']],

        [['2B1', '2B2'],
         ['2B1', '2B2']]]], dtype='<U3')
于 2020-07-19T22:04:12.017 回答
0

您的布局有点不寻常,但这个重复的堆栈似乎可以完成这项工作:

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')
于 2020-07-19T19:41:00.840 回答
0

提出的两条评论(@hpaulj,@Richard K Yu)都有一个小错误,但幸运的是他们犯了一个不同的错误,所以我可以合并他们的想法来创建一个解决方案。我的解决方案是:

np.array([np.stack((One,One)),np.array(np.meshgrid(*Two))])

但是,如果有人知道更优雅的解决方案,我会很高兴,因为目前它有点笨拙。

于 2020-07-19T20:20:57.320 回答