合并两个numpy矩阵来创建元素方面的元组

时间:2018-02-09 18:23:58

标签: python numpy tuples

我不确定之前是否曾经问过这个问题,但我找不到解决这个看似简单问题的方法。我有两个这样的数组:

x = np.array([[1,2,3],[4,5,6]])
y = np.array([[1,2,3],[7,8,9]])

我想创建一个合并矩阵,如:

merged = [[(1,1),(2,2),(3,3)],[(4,7),(5,8),(6,9)]]

实现这一目标的最快方法是什么?我正在使用python 2.

1 个答案:

答案 0 :(得分:0)

stack是一种新的,方便的创建这样的数组的方法。它与np.array类似,但我们可以指定新轴:

In [117]: x = np.array([[1,2,3],[4,5,6]])
     ...: y = np.array([[1,2,3],[7,8,9]])
     ...: 
In [118]: x.shape
Out[118]: (2, 3)
In [119]: np.stack((x,y),axis=2)
Out[119]: 
array([[[1, 1],
        [2, 2],
        [3, 3]],

       [[4, 7],
        [5, 8],
        [6, 9]]])

如果没有stack,您可以在新的第一个轴上组合数组,然后更改轴的顺序:

In [120]: np.array((x,y))
Out[120]: 
array([[[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [7, 8, 9]]])
In [121]: np.array((x,y)).transpose(1,2,0)
Out[121]: 
array([[[1, 1],
        [2, 2],
        [3, 3]],

       [[4, 7],
        [5, 8],
        [6, 9]]])

请注意,像这样的3d数组在技术上不是元组的二维数组。但是对于大多数用途来说,这比那更好。

stack(和dstack)将维度扩展到输入数组,并在该新维度上进行连接。换句话说,他们这样做:

In [123]: np.concatenate((x[...,None],y[...,None]),axis=-1)
Out[123]: 
array([[[1, 1],
        [2, 2],
        [3, 3]],

       [[4, 7],
        [5, 8],
        [6, 9]]])