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

标签 python arrays list python-2.7 numpy

我想添加一个formula1矢量到 formula2矩阵。

formula1 vector 目前是一个列表(尽管很容易转换为一维 Numpy 数组)。

还有 formula2矩阵目前是一个 Numpy 数组。

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

我研究了使用 np.concatenatenp.hstacknp.append。但是,我相信我需要将原始矩阵创建为 formula3矩阵与 formula4列全部 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_stacknp.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/

相关文章:

javascript - Angular 滚动到使用 ng-repeat 创建的列表中的特定项目

python - Heroku 上的 Flask 存在 MailGun 配置问题

python - 使用 Cython 时缺少 numpy 属性

python - 无法安装 TensorFlow Python 依赖项

java - 三元组的最大值和最小值

python - 如何对 pandas 列中的列表执行一次热编码?

python - 在字典中按值返回键

arrays - 删除小于数组左侧元素的元素

java - 比较两个数组,然后使用公共(public)元素创建另一个数组(并且不重复)

python - 如何累积/收集/求和列表?