我有两个 numpy 2D 数组 x 和 y,尺寸为 x(700,5) 和 y(10,5)。
当我运行以下命令时,
xy = list(zip(x.T, y.T))
我得到一个包含 5 个元组的列表。每个元组中有两个维度为 (700,) 和 (10,) 的数组。
我需要它们是 (700,1) 和 (10,1)。
我怎样才能做到这一点?
最佳答案
In [128]: a = np.ones((5,3),int)
In [129]: a.T
Out[129]:
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
In [131]: list(zip(a.T, (a+3).T))
Out[131]:
[(array([1, 1, 1, 1, 1]), array([4, 4, 4, 4, 4])),
(array([1, 1, 1, 1, 1]), array([4, 4, 4, 4, 4])),
(array([1, 1, 1, 1, 1]), array([4, 4, 4, 4, 4]))]
zip
迭代输入的第一个维度。在本例中,它是转置数组的行。因此,每次迭代都会获取一行,即一维数组。结果是一个元组列表,每个元组由两个一维数组组成。
我们可以在处理之前向 a
添加维度:
In [132]: a=a[None,:,:]
In [133]: a.shape
Out[133]: (1, 5, 3)
In [134]: a.T.shape
Out[134]: (3, 5, 1)
In [135]: list(zip(a.T, (a+3).T))
Out[135]:
[(array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4],
[4],
...
[4],
[4]]))]
In [136]: _[0][0].shape
Out[136]: (5, 1)
我不会形容它很漂亮,但它似乎满足您的要求。
或者您可以使用列表理解来扩展 zip,然后添加维度:
In [139]: [(i[:,None],j[:,None]) for i,j in zip(a.T, (a[:2]+3).T)]
Out[139]:
[(array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4]])), (array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4]])), (array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4]]))]
这也有效:
list(zip(*np.atleast_3d(a.T,b.T)))
atleast_3d
可以对数组列表进行操作,使每个数组成为 (M, N, 1)。这是一个我不经常使用的特殊功能。
关于python - zip() 之后的 Numpy 数组维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48615653/