【问题标题】:Best way to add a new column to a Numpy array向 Numpy 数组添加新列的最佳方法
【发布时间】:2014-07-16 09:28:48
【问题描述】:

我想将 向量添加到 矩阵。

向量当前是一个列表(虽然很容易转换为一维 Numpy 数组)。

而 矩阵目前是一个 Numpy 数组。

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

我研究过使用np.concatenatenp.hstacknp.append。但是,我相信我需要将我的原始矩阵创建为 矩阵,其中 列全部为None。这对我不起作用,因为在需要将最后一个向量添加到它之前,我使用这个矩阵进行了许多计算。

【问题讨论】:

  • 我怎样才能让 Latex 代码在这里工作?
  • 参见例如here
  • @FredrikPihl - 我只是使用 URL 来解释 Latex,但实际上只有一个 URL 有效。我检查了所有这些,它们都给出了我想在这个问题中显示的正确公式。有什么帮助吗?

标签: python arrays list python-2.7 numpy


【解决方案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]])
>>> 

【讨论】:

  • 这个答案是错误的。这段代码所做的实际上是将a 列数组添加到b 的每一列。只需打印ab,然后打印a + b。还有a + b的形状和b的形状完全一样((5, 6))
【解决方案2】:

你可以使用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 这样的操作可能需要为更大的数组分配新空间,并且arr 中的所有值复制 到新数组中。这可能很慢并且内存效率低下。 (当您只需要一个时,为什么要为两个几乎相同的数组分配空间?)

因此,您可以使用

arr = np.empty((3, 5))  # the size of the final, biggest array
smallarr = arr[:, :-1]  

因为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.]])

当分配给smallarr 时,请务必使用smallarr[...] = ... 而不是smallarr = ...,因为您想就地修改smallarr,而不是将变量名重定向到新对象。

您还可以使用许多 NumPy 函数中的out 参数来修改smallarr。该函数除了返回值外,还将值写入out参数指定的数组中。

因此,您可以在 smallarr 上进行计算,并且 arr 已经修改,大小合适,并且所有操作都以节省内存的方式完成

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多