Skip to main content
 首页 » 编程设计

python之将新列添加到 Numpy 数组的最佳方法

2025年05月04日11kevingrace

我想添加一个formula1矢量到 formula2矩阵。

formula1 vector 目前是一个列表(尽管很容易转换为一维 Numpy 数组)。

还有 formula2矩阵目前是一个 Numpy 数组。

我在想我可以 reshape formula2矩阵到 formula3矩阵,然后遍历最后一列添加所需的值。但是,我不确定如何以这种方式 reshape 矩阵(即添加一列)。我也希望我不必使用 for 循环。

我研究了使用 np.concatenate、np.hstack 和 np.append。但是,我相信我需要将原始矩阵创建为 formula3矩阵与 formula4列全部 None。这对我不起作用,因为在我需要将最后一个向量添加到它之前,我使用这个矩阵进行了许多计算。

请您参考如下方法:

你可以使用 np.column_stack :

In [100]: v = [1,2,3] 
 
In [101]: arr = np.arange(12).reshape(3,4) 
 
In [102]: arr 
Out[102]:  
array([[ 0,  1,  2,  3], 
       [ 4,  5,  6,  7], 
       [ 8,  9, 10, 11]]) 
 
In [103]: np.column_stack([arr, v]) 
Out[103]:  
array([[ 0,  1,  2,  3,  1], 
       [ 4,  5,  6,  7,  2], 
       [ 8,  9, 10, 11,  3]]) 

但是请注意,最好首先分配所需的大小合适(且最大)的数组,因为像 np.column_stack 或 np.append 这样的操作可能需要为更大的数组分配新空间,并将 arr 中的所有值复制到新数组中。这可能很慢,而且内存效率低下。 (当你只需要一个时,为什么要为两个几乎相同的数组分配空间?)

因此,您可以使用

arr = np.empty((3, 5))  # the size of the final, biggest array 
smallarr = arr[:, :-1]   

由于 arr[:, :-1] 是 arr 的基本切片,smallarr 是一个 View 的 arr。修改 smallarr 也会影响 arr。

例如:

In [117]: arr = np.empty((3, 5)) 
 
In [118]: smallarr = arr[:, :-1] 
 
In [119]: smallarr[...] = np.arange(12).reshape(3,4) 
 
In [123]: arr[:, -1] = v 
 
In [124]: arr 
Out[124]:  
array([[  0.,   1.,   2.,   3.,   1.], 
       [  4.,   5.,   6.,   7.,   2.], 
       [  8.,   9.,  10.,  11.,   3.]]) 

当分配给 smallarr 时,一定要使用 smallarr[...] = ... 而不是 smallarr = ...因为您想就地修改 smallarr,而不是将变量名重定向到新对象。

您还可以使用许多 NumPy 函数中可用的 out 参数修改 smallarr。除了返回值外,该函数还将值写入 out 参数指定的数组。

因此,您可以在 smallarr 上进行计算,并且已经修改了 arr 并且具有正确的大小,并且所有这些都以内存高效的方式完成。