深入理解NumPy 的 np.column_stack的实现
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1.np.column_stack是什么?</a></li><li><a href="#_label1">2. 为什么要用 column_stack?</a></li><li><a href="#_label2">3. 示例:从最基础到更实用</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">3.1 堆叠两个 1D 数组</a></li><li><a href="#_lab2_2_1">3.2 堆叠两个 2D 数组</a></li><li><a href="#_lab2_2_2">3.3 混合 1D 和 2D 数组</a></li></ul><li><a href="#_label3">4.column_stack的可视化理解</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">5. column_stack 的典型使用场景</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_3">5.1 拼接多个特征列(ML/数据分析常用)</a></li><li><a href="#_lab2_4_4">5.2 合并 ground truth + 预测结果</a></li><li><a href="#_lab2_4_5">5.3 将多个独立数组快速构建成一张表</a></li></ul><li><a href="#_label5">6. 与其他堆叠函数的对比总结</a></li><ul class="second_class_ul"></ul></ul></div><p>在使用 NumPy 进行数据处理时,我们经常会遇到把多个数组按照列(column)组合成一个矩阵的需求。最常见的场景包括:</p><ul><li>将多个特征列合并成一个训练数据矩阵</li><li>合并 GT 与预测结果</li><li>将多个 1D 数组拼成 2D 数组</li></ul>
<p>很多人第一时间会想到 <code>np.hstack</code>,但其实 <code>np.column_stack</code> 才是真正为“列拼接”设计的函数,尤其对 1D 数组的处理更加符合直觉。</p>
<p>本文将从原理、差异、示例到图解,全面讲解 <code>np.column_stack</code> 的使用。</p>
<p class="maodian"><a name="_label0"></a></p><h2>1.np.column_stack是什么?</h2>
<p><code>np.column_stack</code> 的作用是:<br />将多个数组以“列”的方式拼接成一个新的二维数组。<br />如果输入数组是 1D,会先转换为列向量再拼接。<br />函数签名非常简单:</p>
<div class="jb51code"><pre class="brush:py;">numpy.column_stack(tup)
</pre></div>
<ul><li>tup:一个序列(列表、元组均可),其中的每个元素是数组或可转为数组的对象。</li><li>返回:一个二维数组。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>2. 为什么要用 column_stack?</h2>
<p>很多初学者会把 column_stack 和 hstack 混用,但它们的行为有显著不同:</p>
<table><thead><tr><th>函数</th><th>输入 1D 数组时</th><th>输入 2D 数组时</th><th>用途</th></tr></thead><tbody><tr><td>column_stack</td><td>自动转成列向量,并按列组合</td><td>按列组合(与 hstack 等价)</td><td>组合特征列、更自然的列拼接</td></tr><tr><td>hstack</td><td>直接水平拼接成一行</td><td>按列组合</td><td>更接近简单拼接</td></tr></tbody></table>
<p>简而言之:</p>
<p>👉 如果你把 1D 数组当成“数据列(column)”,应该用 <code>column_stack</code>。</p>
<p class="maodian"><a name="_label2"></a></p><h2>3. 示例:从最基础到更实用</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>3.1 堆叠两个 1D 数组</h3>
<div class="jb51code"><pre class="brush:py;">import numpy as np
a = np.array()
b = np.array()
result = np.column_stack((a, b))
print(result)
</pre></div>
<p>输出:</p>
<blockquote><p>[<br /> <br /> ]</p></blockquote>
<p>解释:</p>
<ul><li>a 和 b 是 (3,) 的 1D 数组</li><li>column_stack 会自动变成 (3,1) 列向量</li><li>按列合并得到 (3,2) 矩阵</li></ul>
<p>这恰好符合我们对“合并两个特征列”的直觉。</p>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>3.2 堆叠两个 2D 数组</h3>
<div class="jb51code"><pre class="brush:py;">a = np.array([, ])
b = np.array([, ])
result = np.column_stack((a, b))
print(result)
</pre></div>
<p>输出:</p>
<blockquote><p>[<br /> ]</p></blockquote>
<p>二维数组时,<code>column_stack</code> 和 <code>hstack</code> 表现相同——横向拼接。</p>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>3.3 混合 1D 和 2D 数组</h3>
<div class="jb51code"><pre class="brush:py;">a = np.array()
b = np.array([, , ])
result = np.column_stack((a, b))
print(result)
</pre></div>
<p>输出:</p>
<blockquote><p>[<br /> <br /> ]</p></blockquote>
<p>1D 会自动转换为列向量,非常方便。</p>
<p class="maodian"><a name="_label3"></a></p><h2>4.column_stack的可视化理解</h2>
<p>下面是一个更直观的图示,有助于你彻底理解 <code>column_stack</code> 的工作原理:</p>
<p>1D → 列向量 → 按列组合</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709535053.png" /></p>
<p>图中左侧是两个 1D 数组,它们被转换成两列,再拼成一个 2D 数组。</p>
<p>这个可视化呈现出了 column_stack 的核心:<br />👉 把每个输入都当成“一列”,然后拼接。</p>
<p class="maodian"><a name="_label4"></a></p><h2>5. column_stack 的典型使用场景</h2>
<p class="maodian"><a name="_lab2_4_3"></a></p><h3>5.1 拼接多个特征列(ML/数据分析常用)</h3>
<div class="jb51code"><pre class="brush:py;">age = np.array()
height = np.array()
X = np.column_stack((age, height))
</pre></div>
<p>即:</p>
<blockquote><p>[[ 18 170]<br /> [ 25 180]<br /> [ 32 165]]</p></blockquote>
<p>这就是典型的 特征矩阵 X。</p>
<p class="maodian"><a name="_lab2_4_4"></a></p><h3>5.2 合并 ground truth + 预测结果</h3>
<div class="jb51code"><pre class="brush:py;">gt = np.array()
pred = np.array()
np.column_stack((gt, pred))
</pre></div>
<p class="maodian"><a name="_lab2_4_5"></a></p><h3>5.3 将多个独立数组快速构建成一张表</h3>
<div class="jb51code"><pre class="brush:py;">name = ["a", "b", "c"]
score =
table = np.column_stack((name, score))
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>6. 与其他堆叠函数的对比总结</h2>
<table><thead><tr><th>函数</th><th>按列还是按行?</th><th>对 1D 数组的处理</th><th>最适合用途</th></tr></thead><tbody><tr><td>column_stack</td><td>按列</td><td>自动变“列”</td><td>构建数据矩阵、特征拼接</td></tr><tr><td>hstack</td><td>按行水平拼接</td><td>直接拼成一维</td><td>简单拼接</td></tr><tr><td>vstack</td><td>按行堆叠</td><td>变为行向量</td><td>竖向堆数据</td></tr><tr><td>stack</td><td>增加新维度</td><td>完全自定义 axis</td><td>自由组合三维/四维结构</td></tr></tbody></table>
<p>建议记忆:</p>
<p>column_stack = feature_columns 的组合工具</p>
<p>对于机器学习、图像关键点、GT+pred 数据结构来说特别适用。</p>
頁:
[1]