【问题标题】:How can I efficiently sort two large numpy arrays into an array of arrays?如何有效地将两个大型 numpy 数组排序为数组数组?
【发布时间】:2020-06-19 18:40:32
【问题描述】:

假设我有两个实际上非常大的二维 numpy 数组(订购 100 万个元素):

a = np.array([1,2,3],[4,5,6],[7,8,9])
b = np.array([11,22,33],[44,55,66],[77,88,99])

我想创建一个新数组,其元素是 1d,来自 a 的 i,j 分量和 b 的 i,j 分量的二元素数组:

c = [[1,11], [2,22], [3,33], [4,44], [5,55], [6,66], [7,77], [8,88], [9,99]]

我正在尝试做这样的事情:

c = np.array([])
for i in range(0,3):
     for j in range(0,3):
          number_pair = numpy.array([a[i,j], b[i,j]])
          c = numpy.append(c, number_pair)

然而,这“扁平化”了产生的数组:

c = [1,11,2,22,3,33,4,44,5,55,6,66,7,77,8,88,9,99]

这是 vstack 可以处理的吗?有没有更简单的方法来考虑这个问题并且仍然得到想要的结果?

如果有人能举个玩具例子,我将不胜感激。

【问题讨论】:

  • np.stack([a, b], -1).reshape(-1,2) 怎么样?

标签: python numpy


【解决方案1】:

让我们从更简单的东西开始 - zip 在简单数组上:

In [113]: a = [1,2,3,4,5,6,7,8,9] 
     ...: b = [11,22,33,44,55,66,77,88,99]                                                     
In [114]: list(zip(a,b))                                                                       
Out[114]: 
[(1, 11),
 (2, 22),
 (3, 33),
 (4, 44),
 (5, 55),
 (6, 66),
 (7, 77),
 (8, 88),
 (9, 99)]

这就是你想要的 - 除了它是一个元组列表,而不是列表。

您的ab 似乎有某种嵌套,即带有列表的列表。所以他们需要被展平才能使用这种zip。有多种方法可以展平列表,但使用数组更简单。

但首先 - 试试你的 a 表达式:

In [116]: a = np.array([1,2,3],[4,5,6],[7,8,9])                                                
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-116-41a87620921a> in <module>
----> 1 a = np.array([1,2,3],[4,5,6],[7,8,9])

ValueError: only 2 non-keyword arguments accepted

你缺少括号:

In [117]: a = np.array([[1,2,3],[4,5,6],[7,8,9]])                                              
In [118]: a                                                                                    
Out[118]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
In [119]: a.shape                                                                              
Out[119]: (3, 3)
In [120]: b = np.array([[11,22,33],[44,55,66],[77,88,99]])                                     
In [121]: b.shape                                                                              
Out[121]: (3, 3)

扁平化数组很容易:

In [122]: a.ravel()                                                                            
Out[122]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

In [123]: list(zip(a.ravel(), b.ravel()))                                                      
Out[123]: 
[(1, 11),
 (2, 22),
 (3, 33),
 (4, 44),
 (5, 55),
 (6, 66),
 (7, 77),
 (8, 88),
 (9, 99)]

我们也可以将这两个展平数组合二为一:

In [125]: np.array([a.ravel(),b.ravel()])                                                      
Out[125]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
       [11, 22, 33, 44, 55, 66, 77, 88, 99]])

然后使用numpy转置:

In [126]: np.array([a.ravel(),b.ravel()]).T                                                    
Out[126]: 
array([[ 1, 11],
       [ 2, 22],
       [ 3, 33],
       [ 4, 44],
       [ 5, 55],
       [ 6, 66],
       [ 7, 77],
       [ 8, 88],
       [ 9, 99]])

还有许多其他组合这些数组的方法。

In [127]: np.array((a,b))                                                                      
Out[127]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[11, 22, 33],
        [44, 55, 66],
        [77, 88, 99]]])
In [128]: _.transpose(1,2,0).reshape(-1,2)                                                     
Out[128]: 
array([[ 1, 11],
       [ 2, 22],
       [ 3, 33],
       [ 4, 44],
       [ 5, 55],
       [ 6, 66],
       [ 7, 77],
       [ 8, 88],
       [ 9, 99]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2011-05-20
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多