我想将向量添加到矩阵。
向量当前是一个列表(尽管很容易转换为1D Numpy数组)。
矩阵当前是一个Numpy数组。
我在想我可以将矩阵重新整形为矩阵,然后遍历最后一列添加所需的值。但是,我不确定如何以这种方式重塑矩阵(即添加一列)。我也希望我不必使用for循环。
我使用np.concatenate
,np.hstack
和np.append
进行了调查。但是,我认为我需要将原始矩阵创建为矩阵,列全部为None
。这对我不起作用,因为在我需要将最后一个向量添加到它之前,我将此矩阵用于许多计算。
答案 0 :(得分:6)
您可以使用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
等操作可能需要为更大的数组分配新空间并将<{1}}中的所有值复制到新数组中。这可能是缓慢的,也可能是内存效率低下的。 (为什么只为两个几乎相同的数组分配空间,只需要一个?)
相反,您可以使用
arr
由于arr = np.empty((3, 5)) # the size of the final, biggest array
smallarr = arr[:, :-1]
是arr[:, :-1]
的基本切片,arr
是arr的视图。修改smallarr
也会影响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 = ...
,而不是将变量名称重定向到新对象
您还可以使用许多NumPy函数中提供的smallarr
参数来修改smallarr
。除了返回值之外,该函数还将值写入out
参数`指定的数组。
因此,您可以在out
上进行计算,并且smallarr
已经修改并且大小合适,并且以内存效率的方式完成。
答案 1 :(得分:1)
如果两者都是正确形状的numpy数组,由于广播,它会自动工作:
>>> m, n = 5, 6
>>> import numpy as np
>>> a = np.random.rand(5)
>>> b = np.random.rand(5, 6)
>>> a + b
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (5,) (5,6)
>>> a = a.reshape((5, 1))
>>> a + b
array([[ 0.79046654, 0.81610381, 1.6719495 , 1.46325624, 0.92063256,
1.06377227],
[ 1.6789712 , 1.39644844, 0.94905931, 0.95343555, 1.02492318,
1.15156054],
[ 1.37071564, 0.96554418, 1.75242678, 1.33323359, 1.00644693,
1.08850993],
[ 1.03423776, 1.03496123, 0.82535266, 0.12488793, 0.45481279,
0.90367567],
[ 0.51112569, 0.49737014, 1.01857201, 0.64392256, 0.23526375,
1.12763083]])
>>>
见