将多维元素附加到 numpy 数组中而不进行整形
Posted
技术标签:
【中文标题】将多维元素附加到 numpy 数组中而不进行整形【英文标题】:appending multidimensional elements into numpy arrays without reshaping 【发布时间】:2017-08-05 08:22:41 【问题描述】:我有几个简单的问题无法找到答案。它们都在以下示例代码中进行了说明。感谢您的任何帮助!
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))
编辑:使代码更简洁
【问题讨论】:
那么,你的循环部分不是实现了形成所有排列的目标吗? 是的,但肯定有一种干净的方法可以做到这一点?我试图避免在numpy中循环数组。我可以使用 np.zip() 之类的应用程序吗? 【参考方案1】:要回答您的第一个问题,您可以使用 np.meshgrid
在两个输入数组的元素之间形成这些组合,并以矢量化方式避免这些循环,从而获得 temp
的最终版本,就像这样 -
np.array(np.meshgrid(a,b)).transpose(2,1,0).reshape(-1,2)
如所见,如果您打算获得 2 列输出数组,我们仍然需要重新整形。
还有其他方法可以构造具有网状结构的数组,从而避免重塑。其中一种方法是使用np.column_stack
,如下所示 -
r,c = np.meshgrid(a,b)
temp = np.column_stack((r.ravel('F'), c.ravel('F')))
【讨论】:
感谢 Divakar——我编辑了示例代码,所以现在应该是 np.array(np.meshgrid(a,b)).transpose(2,1,0).reshape(-1 ,2) @kevinkayaks 感谢清理工作!相应地编辑了我的代码。【参考方案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 数组中而不进行整形的主要内容,如果未能解决你的问题,请参考以下文章