如何添加numpy数组的元素并创建新的numpy数组

时间:2016-03-20 00:05:06

标签: python numpy

我有一个像这样的现有numpy数组:

boxes = np.array([
        (59, 119, 175, 14),
        (147, 107, 66, 11)])

我想从上面的numpy数组中创建一个新的numpy数组,以便:

element 2 = element 0 + element 2
element 3 = element 1 + element 3 

即。

(59, 119, 234, 133),
(147, 108, 213, 119)

4 个答案:

答案 0 :(得分:1)

对于您的特定问题,您可以创建一个新的numpy数组,其中前两列保持不变,第2列和第3列(基于0的索引)是它们与列0和1之间的总和的结果,分别使用column_stack,它允许将数组堆叠为列。

具体来说,您的示例中的代码如下所示:

boxes = np.array([(59, 119, 175, 14), (147, 107, 66, 11)])
np.column_stack([boxes[:,0], boxes[:,1], boxes[:,2]+boxes[:,0], boxes[:,3]+boxes[:,1]])

,输出

array([[ 59, 119, 234, 133], [147, 107, 213, 118]])

如果您有更通用的更新规则,可能会对此代码进行推广,从而可以使用concatenate函数逐列迭代构建矩阵。

答案 1 :(得分:0)

我想我应该对我的代码附上一些解释,但我真的不知道该解释什么。你真的应该阅读numpy docs。

res = boxes.copy()
res[:, 2] += res[:, 0]
res[:, 3] += res[:, 1]
res

array([[ 59, 119, 234, 133],
       [147, 107, 213, 118]])

答案 2 :(得分:0)

这并不比其他答案更好,因为它值得......

import numpy as np

boxes = np.array([
        (59, 119, 175, 14),
        (147, 107, 66, 11)])

new_boxes = np.hstack([
  boxes[:,0].reshape((2,1)),
  boxes[:,1].reshape((2,1)),
  (boxes[:,0]+boxes[:,2]).reshape((2,1)),
  (boxes[:,1]+boxes[:,3]).reshape((2,1))])

导致:

array([[ 59, 119, 234, 133],
       [147, 107, 213, 118]])

答案 3 :(得分:0)

这可以通过一个附加表达式(一次处理整个2x2块)来完成。

In [137]: boxes = np.array([
        (59, 119, 175, 14),
        (147, 107, 66, 11)])
In [138]: res = boxes.copy()
In [139]: res[:,2:] += res[:,:2]
In [140]: res
Out[140]: 
array([[ 59, 119, 234, 133],
       [147, 107, 213, 118]])

如果您不介意修改boxes本身,可以跳过副本。

总和也可以用重塑和求和来计算:

In [142]: boxes.reshape(2,2,2).sum(axis=1)
Out[142]: 
array([[234, 133],
       [213, 118]])

使用cumsum

引导我进入另一种解决方案
In [143]: np.cumsum(boxes.reshape(2,2,2),axis=1)
Out[143]: 
array([[[ 59, 119],
        [234, 133]],

       [[147, 107],
        [213, 118]]], dtype=int32)
In [144]: np.cumsum(boxes.reshape(2,2,2),axis=1).reshape(2,4)
Out[144]: 
array([[ 59, 119, 234, 133],
       [147, 107, 213, 118]], dtype=int32)

切片和重塑是使用数组块的两种方便方法。