Python 将多维元素添加到numpy数组中而不重新整形

Python 将多维元素添加到numpy数组中而不重新整形,python,numpy,multidimensional-array,append,Python,Numpy,Multidimensional Array,Append,我有几个简单的问题找不到答案。它们都在下面的示例代码中说明。谢谢你的帮助 import numpy as np #here are two arrays to join together a = np.array([1,2,3,4,5]) b = np.array([6,7,8,9,10]) #here comes the joining step I don't know how to do better #QUESTION 1: How to form all permutations

我有几个简单的问题找不到答案。它们都在下面的示例代码中说明。谢谢你的帮助

import numpy as np 
#here are two arrays to join together 
a = np.array([1,2,3,4,5])
b = np.array([6,7,8,9,10])
#here comes the joining step I don't know how to do better

#QUESTION 1: How to form all permutations of two 1D arrays?

temp = np.array([]) #empty array to be filled with values 
for aa in a: 
    for bb in b: 
        temp = np.append(temp,[aa,bb]) #fill the array

#QUESTION 2: Why do I have to reshape? How can I avoid this? 

temp = temp.reshape((int(temp.size/2),2)) 

编辑:使代码更加精简要回答您的第一个问题,您可以使用在两个输入数组的元素之间形成这些组合,并以矢量化的方式获得
temp
的最终版本,避免这些循环,如下所示-

np.array(np.meshgrid(a,b)).transpose(2,1,0).reshape(-1,2)
如图所示,如果您想要得到一个2列输出数组,我们仍然需要进行重塑


我们还可以通过其他方式使用网格结构构建阵列,从而避免重塑。其中一种方法是使用
np.column\u stack
,如下所示-

r,c = np.meshgrid(a,b)
temp = np.column_stack((r.ravel('F'), c.ravel('F')))

要回答第一个问题,您可以使用在两个输入数组的元素之间形成这些组合,并以矢量化的方式获得
temp
的最终版本,避免这些循环,如下所示-

np.array(np.meshgrid(a,b)).transpose(2,1,0).reshape(-1,2)
如图所示,如果您想要得到一个2列输出数组,我们仍然需要进行重塑


我们还可以通过其他方式使用网格结构构建阵列,从而避免重塑。其中一种方法是使用
np.column\u stack
,如下所示-

r,c = np.meshgrid(a,b)
temp = np.column_stack((r.ravel('F'), c.ravel('F')))

迭代构建数组的正确方法是使用list append
np.append
的名称不好,经常被误用

In [274]: a = np.array([1,2,3,4,5])
     ...: b = np.array([6,7,8,9,10])
     ...: 
In [275]: temp = []
In [276]: for aa in a:
     ...:     for bb in b:
     ...:         temp.append([aa,bb])
     ...:         
In [277]: temp
Out[277]: 
[[1, 6],
 [1, 7],
 [1, 8],
 [1, 9],
 [1, 10],
 [2, 6],
  ....
 [5, 9],
 [5, 10]]
In [278]: np.array(temp).shape
Out[278]: (25, 2)

最好完全避免循环,但如果必须,请使用此列表附加方法。

迭代构建数组的正确方法是使用列表附加
np.append
的名称不好,经常被误用

In [274]: a = np.array([1,2,3,4,5])
     ...: b = np.array([6,7,8,9,10])
     ...: 
In [275]: temp = []
In [276]: for aa in a:
     ...:     for bb in b:
     ...:         temp.append([aa,bb])
     ...:         
In [277]: temp
Out[277]: 
[[1, 6],
 [1, 7],
 [1, 8],
 [1, 9],
 [1, 10],
 [2, 6],
  ....
 [5, 9],
 [5, 10]]
In [278]: np.array(temp).shape
Out[278]: (25, 2)

最好完全避免循环,但如果必须,请使用此列表附加方法。

那么,循环部分是否达到了形成所有排列的目标?是的,但肯定有一种干净的方法可以做到这一点?我试图避免在numpy中循环数组。我可以使用np.zip()之类的应用程序吗?那么,你的循环部分不是实现了形成所有排列的目标吗?是的,但肯定有一种干净的方法可以做到这一点吗?我试图避免在numpy中循环数组。我可以使用np.zip()之类的应用程序吗?谢谢Divakar——我编辑了示例代码,不过现在应该是np.array(np.meshgrid(a,b)).transpose(2,1,0)。重塑(-1,2)@kevinkayaks感谢清理!相应地编辑了我的代码。谢谢Divakar——我编辑了示例代码,不过现在应该是np.array(np.meshgrid(a,b)).transpose(2,1,0)。重塑(-1,2)@kevinkayaks感谢清理!相应地编辑了我的代码。