eTo*_*us1 1 python arrays numpy list python-2.7
我想补充一个 矢量到
矩阵.
该 vector目前是一个列表(虽然很容易转换为1D Numpy数组).
而且 matrix目前是一个Numpy数组.
我以为我可以重塑一下 矩阵到a
矩阵然后遍历最后一列添加所需的值.但是,我不确定如何以这种方式重塑矩阵(即添加一列).我也希望我不必使用for循环.
我看着使用np.concatenate,np.hstack和np.append.但是,我相信我需要创建我原来的矩阵作为 矩阵与
列全部
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]])
Run Code Online (Sandbox Code Playgroud)
但请注意,最好先分配所需的正确大小(和最大)数组,因为类似np.column_stack或np.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已经修改了正确的大小,并且都以内存效率的方式完成.