python - zip() 之后的 Numpy 数组维度

标签 python numpy

我有两个 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/

相关文章:

python - 编写 if 语句的更短、更 Pythonic 的方式

python - 在 Flask 中获取请求负载的一致方法

numpy - 从 Pycharm 运行 numpy

python - 用 numpy 最小二乘法拟合线性表面

python - numpy:在两个二维数组的一个公共(public)轴上广播乘法

python - Pyspark:从 blob 存储加载 zip 文件

python - 如何在 Windows 上的 python 中创建区分大小写的文件?

python - statsmodels、scipy 和 numpy 提供的自相关函数有什么区别?

Python:如何将列表添加到命名多维数组

python - 在 Fedora Linux 上的 Jupyter 中运行 Python 2 和 3