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

eTo*_*us1 1 python arrays numpy list python-2.7

我想补充一个 公式1 矢量到 formula2 矩阵.

公式1 vector目前是一个列表(虽然很容易转换为1D Numpy数组).

而且 formula2 matrix目前是一个Numpy数组.

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

我看着使用np.concatenate,np.hstacknp.append.但是,我相信我需要创建我原来的矩阵作为formula3 矩阵与 formula4列全部None.这对我不起作用,因为在我需要将最后一个向量添加到它之前,我将此矩阵用于许多计算.

unu*_*tbu 7

你可以使用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]])
Run Code Online (Sandbox Code Playgroud)

但请注意,最好先分配所需的正确大小(和最大)数组,因为类似np.column_stacknp.append可能需要为更大的数组分配新空间并将所有值复制arr到新数组中.这可能是缓慢的,也可能是内存效率低下的.(为什么只为两个几乎相同的数组分配空间,只需要一个?)

所以相反,你可以使用

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

既然arr[:, :-1]是一个基本的切片arr,smallarr是一个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.]])
Run Code Online (Sandbox Code Playgroud)

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

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

因此,您可以进行计算,smallarr并且arr已经修改了正确的大小,并且都以内存效率的方式完成.