C#中与numpy.expand_dims功能等价的实现方法是什么
参考Python实现效果:
import numpy as np a = np.array([2,4]) b = np.expand_dims(a, axis=0) # b输出为 array([[2,4]]),shape为(1,2)
C#实现等价扩展维度的方案
1. 纯原生实现(无需第三方依赖)
直接将一维数组封装为对应shape的二维数组即可,示例代码如下:
// 原始一维数组,对应Python代码中的 np.array([2,4]) int[] a = new int[] { 2, 4 }; // 在axis=0维度扩展,得到shape为(1,2)的二维数组 int[,] b = new int[1, a.Length]; for (int i = 0; i < a.Length; i++) { b[0, i] = a[i]; } // 维度验证:b.GetLength(0) 返回1,b.GetLength(1) 返回2,和Python效果一致
如果需要通用的扩展维度方法,可以封装为泛型工具函数,支持axis=0和axis=1两种常见场景:
public static class ArrayExtension { /// <summary> /// 为一维数组扩展维度 /// </summary> /// <param name="source">原始一维数组</param> /// <param name="axis">扩展维度的位置,0为行维度,1为列维度</param> /// <returns>扩展后的二维数组</returns> public static T[,] ExpandDims<T>(this T[] source, int axis = 0) { if (source == null) throw new ArgumentNullException(nameof(source)); if (axis is < 0 or > 1) throw new ArgumentOutOfRangeException(nameof(axis), "仅支持axis=0或axis=1"); var result = axis == 0 ? new T[1, source.Length] : new T[source.Length, 1]; for (int i = 0; i < source.Length; i++) { if (axis == 0) result[0, i] = source[i]; else result[i, 0] = source[i]; } return result; } } // 调用示例 int[] a = new int[] { 2, 4 }; int[,] b = a.ExpandDims(0);
2. 使用MathNet.Numerics实现(数值计算场景推荐)
MathNet.Numerics是C#生态中主流的数值计算库,功能对标Python的numpy,实现方式如下:
- 先安装NuGet依赖:
MathNet.Numerics - 示例代码:
using MathNet.Numerics.LinearAlgebra; // 构建一维向量,对应numpy的一维数组 var a = Vector<double>.Build.Dense(new double[] { 2, 4 }); // 转为行矩阵,等价于expand_dims(axis=0),shape为(1,2) var b = a.ToRowMatrix(); // 维度验证:b.RowCount = 1,b.ColumnCount = 2
如果需要axis=1的扩展效果,调用a.ToColumnMatrix()即可得到shape为(n,1)的矩阵。
3. 使用NumSharp实现(接口完全对齐numpy)
NumSharp是专门仿照numpy接口开发的C#库,调用方式和Python几乎完全一致:
- 先安装NuGet依赖:
NumSharp - 示例代码:
using NumSharp; var a = np.array(new int[] { 2, 4 }); var b = np.expand_dims(a, axis: 0); // 效果和Python完全一致,b.shape 输出为 (1, 2)
内容的提问来源于stack exchange,提问作者Peter11211
相关产品推荐
相关产品推荐

