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

时间:2014-05-27 12:49:34

标签: python arrays list python-2.7 numpy

我想将formula1向量添加到formula2矩阵。

formula1向量当前是一个列表(尽管很容易转换为1D Numpy数组)。

formula2矩阵当前是一个Numpy数组。

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

我使用np.concatenatenp.hstacknp.append进行了调查。但是,我认为我需要将原始矩阵创建为formula3矩阵,formula4列全部为None。这对我不起作用,因为在我需要将最后一个向量添加到它之前,我将此矩阵用于许多计算。

2 个答案:

答案 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_stacknp.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]])
>>>