Python 减少冗长的扁平化方法&;在NumPy中连接两个阵列?

Python 减少冗长的扁平化方法&;在NumPy中连接两个阵列?,python,numpy,Python,Numpy,我正在努力做到以下几点 我有两个2D阵列,X和Y。每个都是100x100个元素。我想将它们线性化/展平为10000x1列,然后将它们串联起来,这样就剩下一个10000x2的矩阵。在MATLAB中,我可以执行以下操作 BigMatrix = [X(:) Y(:)] 我想用Python做同样的事情。在使用它一段时间后,我已经能够复制MATLAB结果,尽管是以相当详细的方式,如下所示。有没有更好、更简洁的方法来实现这一点 BigMatrix = np.concatenate( (X.resh

我正在努力做到以下几点

我有两个2D阵列,X和Y。每个都是100x100个元素。我想将它们线性化/展平为10000x1列,然后将它们串联起来,这样就剩下一个10000x2的矩阵。在MATLAB中,我可以执行以下操作

BigMatrix = [X(:) Y(:)]
我想用Python做同样的事情。在使用它一段时间后,我已经能够复制MATLAB结果,尽管是以相当详细的方式,如下所示。有没有更好、更简洁的方法来实现这一点

BigMatrix = np.concatenate(
    (X.reshape((10000,1), order = 'F'), 
     Y.reshape((10000,1), order = 'F')),
      axis=1)

有多种方法可以实现你想要的,你所拥有的是完全有效的。然而,这里有一些其他的方法,你可能会发现更“简洁”

使用 返回折叠为一维的数组的副本

您还可以指定是将其视为列主视图还是行主视图

为了得到您想要的结果(一个m x 2矩阵,每个展平矩阵作为一列),您可以使用

或者,如@ssp所述,如果您想要的是真正简洁的,您可以使用(这基本上为切片提供了特殊的行为)。有两个用于串联,每个轴一个
r_
表示行方向(第一个轴),而
c_
表示列方向(第二个轴),因此要获得m x 2矩阵,可以执行以下操作:

BigMatrix = np.c_[X.flatten(order = 'F'), Y.flatten(order = 'F')]
演出 就性能而言,正如@hpaulj所建议的,使用原始代码可能会更好。下面是三种方法的简单计时,对于100x100矩阵的大小,每种方法都会执行100万次

从timeit导入timeit
打印(“c_w/flatte”),时间(
setup=“将numpy导入为np\nX=np.random.standard\u normal((100100))\nY=np.random.standard\u normal((100100))”,
stmt=“Z=np.c_u2;[X.flatten(order='F'),Y.flatten(order='F')]”
))
打印(“带展平的列堆栈”,timeit(
setup=“将numpy导入为np\nX=np.random.standard\u normal((100100))\nY=np.random.standard\u normal((100100))”,
stmt=“Z=np.column\u堆栈((X.flatten(order='F'),Y.flatten(order='F'))”
))
打印(“连接/重塑”,timeit(
setup=“将numpy导入为np\nX=np.random.standard\u normal((100100))\nY=np.random.standard\u normal((100100))”,
stmt=“Z=np.连接((X.重塑((10000,1),顺序='F'),Y.重塑((10000,1),顺序='F')),轴=1)”
))
我们得到了

c_ w/ flatten            44.47710300699691
column_stack w/ flatten  29.201319813000737
concatenate w/ reshape   27.67507728200144
令人惊讶的是,column_stack和flatte具有可比性,而index例程的速度要慢得多


(如果我在这次性能分析中遗漏了什么,请告诉我。我不是性能大师)。

有多种方法可以实现您的目标,而且您所拥有的是完全有效的。然而,这里有一些其他的方法,你可能会发现更“简洁”

使用 返回折叠为一维的数组的副本

您还可以指定是将其视为列主视图还是行主视图

为了得到您想要的结果(一个m x 2矩阵,每个展平矩阵作为一列),您可以使用

或者,如@ssp所述,如果您想要的是真正简洁的,您可以使用(这基本上为切片提供了特殊的行为)。有两个用于串联,每个轴一个
r_
表示行方向(第一个轴),而
c_
表示列方向(第二个轴),因此要获得m x 2矩阵,可以执行以下操作:

BigMatrix = np.c_[X.flatten(order = 'F'), Y.flatten(order = 'F')]
演出 就性能而言,正如@hpaulj所建议的,使用原始代码可能会更好。下面是三种方法的简单计时,对于100x100矩阵的大小,每种方法都会执行100万次

从timeit导入timeit
打印(“c_w/flatte”),时间(
setup=“将numpy导入为np\nX=np.random.standard\u normal((100100))\nY=np.random.standard\u normal((100100))”,
stmt=“Z=np.c_u2;[X.flatten(order='F'),Y.flatten(order='F')]”
))
打印(“带展平的列堆栈”,timeit(
setup=“将numpy导入为np\nX=np.random.standard\u normal((100100))\nY=np.random.standard\u normal((100100))”,
stmt=“Z=np.column\u堆栈((X.flatten(order='F'),Y.flatten(order='F'))”
))
打印(“连接/重塑”,timeit(
setup=“将numpy导入为np\nX=np.random.standard\u normal((100100))\nY=np.random.standard\u normal((100100))”,
stmt=“Z=np.连接((X.重塑((10000,1),顺序='F'),Y.重塑((10000,1),顺序='F')),轴=1)”
))
我们得到了

c_ w/ flatten            44.47710300699691
column_stack w/ flatten  29.201319813000737
concatenate w/ reshape   27.67507728200144
令人惊讶的是,column_stack和flatte具有可比性,而index例程的速度要慢得多

(如果我在性能分析中遗漏了什么,请告诉我。我不是性能专家)。

对于小型2阵列:

In [404]: x = np.arange(4).reshape(2,2)
按顺序F重塑
是MATLAB
(:)
索引最直接的等价物,生成一个(n,1)数组。(是不是
x(:)。
a(1,n)矩阵的语法?)

连接两个这样的“列向量”很容易:

In [408]: np.concatenate((x1,x1), axis=1)
Out[408]: 
array([[0, 0],
       [2, 2],
       [1, 1],
       [3, 3]])
np.stack
concatenate
的一个版本,它创建了一个新维度并在此维度上进行连接。使用
axis=0时
np.array((x,x))相同

如前所述,顺序F重塑将创建2列数组:

In [411]: np.stack((x,x), axis=2).reshape((-1,2),order='F')
Out[411]: 
array([[0, 0],
       [2, 2],
       [1, 1],
       [3, 3]])
或使用默认顺序:

In [412]: np.stack((x,x), axis=2).reshape((-1,2))
Out[412]: 
array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 3]])
numpy
是一个Python包,使用函数、索引和方法。它不会改变或添加基本Python语法。

使用一个小的2数组:

In [404]: x = np.arange(4).reshape(2,2)
按顺序F重塑
是MATLAB
(:)
索引最直接的等价物,生成一个(n,1)数组。(是不是
x(:)。
a(1,n)矩阵的语法?)

连接两个这样的“列向量”很容易:

In [408]: np.concatenate((x1,x1), axis=1)
Out[408]: 
array([[0, 0],
       [2, 2],
       [1, 1],
       [3, 3]])
np.stack
concatenate
的一个版本,它创建了一个新维度并在此维度上进行连接。使用
axis=0时
np.array((x,x))相同

如前所述,顺序F重塑将创建2列数组:

In [411]: np.stack((x,x), axis=2).reshape((-1,2),order='F')
Out[411]: 
array([[0, 0],
       [2, 2],
       [1, 1],
       [3, 3]])
或使用默认顺序:

In [412]: np.stack((x,x), axis=2).reshape((-1,2))
Out[412]: 
array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 3]])
numpy
是一个Python包,使用函数、索引和方法。它不会改变或添加基本的Python语法。

np.c_u2;[X.flatte(order='F')、Y.flatte(order='F')]