我想添加一个
矢量到
矩阵。
vector 目前是一个列表(尽管很容易转换为一维 Numpy 数组)。
还有
矩阵目前是一个 Numpy 数组。
我在想我可以 reshape
矩阵到
矩阵,然后遍历最后一列添加所需的值。但是,我不确定如何以这种方式 reshape 矩阵(即添加一列)。我也希望我不必使用 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]])
但是请注意,最好首先分配所需的大小合适(且最大)的数组,因为像 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 并且具有正确的大小,并且所有这些都以内存高效的方式完成。
