我有一个像这样的现有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)
答案 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)
切片和重塑是使用数组块的两种方便方法。