我想添加一个矢量到 矩阵。
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
并且具有正确的大小,并且所有这些都以内存高效的方式完成。
关于python - 将新列添加到 Numpy 数组的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23889906/