首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NumPy中从列中减去行

在NumPy中从列中减去行
EN

Stack Overflow用户
提问于 2021-03-28 14:07:01
回答 3查看 795关注 0票数 0

我有一个m-dimensional NumPy数组A和一个n-dimensional NumPy数组B

我想要创建一个m x n矩阵C,这样C[i, j] = B[j] - A[i]

在NumPy中是否有一种高效/矢量化的方法来做到这一点?

目前我正在使用:

代码语言:javascript
复制
C = np.zeros((M, N))
for i in range(0, M):
    C[i, :] = (B - A[i])

编辑:

m, n是大数,因此,C是一个更大的矩阵( m*n条目)。

我试过np.repeatnp.subtract.outer,但它们都让我的内存崩溃

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-28 14:17:17

我想你是在找ǹp.subtract.outer

代码语言:javascript
复制
M = 5
N = 10

A = np.arange(N)
B = np.arange(M)
np.subtract.outer(A,B)

产出:

代码语言:javascript
复制
array([[ 0, -1, -2, -3, -4],
       [ 1,  0, -1, -2, -3],
       [ 2,  1,  0, -1, -2],
       [ 3,  2,  1,  0, -1],
       [ 4,  3,  2,  1,  0],
       [ 5,  4,  3,  2,  1],
       [ 6,  5,  4,  3,  2],
       [ 7,  6,  5,  4,  3],
       [ 8,  7,  6,  5,  4],
       [ 9,  8,  7,  6,  5]])

它将对A和B中的所有对进行减法。对于1维,它等价于

代码语言:javascript
复制
C = empty(len(A),len(B))
for i in range(len(A)):
    for j in range(len(B)):
        C[i,j] = A[i] - B[j]

编辑

如果有内存问题,可以尝试在执行操作和适当设置out关键字之前分配输出缓冲区:

代码语言:javascript
复制
C = np.zeros((M, N))
np.subtract.outer(B, A, out=C)
票数 0
EN

Stack Overflow用户

发布于 2021-03-28 14:19:40

您可以在新轴上重复其中一个数组,然后减去另一个数组。

示例:

代码语言:javascript
复制
m = 10
n = 20

A = np.array(range(m))
B = np.array(range(n))
C = np.repeat(B[:, np.newaxis], m, axis=1) - A

然后C将包含:

代码语言:javascript
复制
array([[ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9],
       [ 1,  0, -1, -2, -3, -4, -5, -6, -7, -8],
       [ 2,  1,  0, -1, -2, -3, -4, -5, -6, -7],
       [ 3,  2,  1,  0, -1, -2, -3, -4, -5, -6],
       [ 4,  3,  2,  1,  0, -1, -2, -3, -4, -5],
       [ 5,  4,  3,  2,  1,  0, -1, -2, -3, -4],
       [ 6,  5,  4,  3,  2,  1,  0, -1, -2, -3],
       [ 7,  6,  5,  4,  3,  2,  1,  0, -1, -2],
       [ 8,  7,  6,  5,  4,  3,  2,  1,  0, -1],
       [ 9,  8,  7,  6,  5,  4,  3,  2,  1,  0],
       [10,  9,  8,  7,  6,  5,  4,  3,  2,  1],
       [11, 10,  9,  8,  7,  6,  5,  4,  3,  2],
       [12, 11, 10,  9,  8,  7,  6,  5,  4,  3],
       [13, 12, 11, 10,  9,  8,  7,  6,  5,  4],
       [14, 13, 12, 11, 10,  9,  8,  7,  6,  5],
       [15, 14, 13, 12, 11, 10,  9,  8,  7,  6],
       [16, 15, 14, 13, 12, 11, 10,  9,  8,  7],
       [17, 16, 15, 14, 13, 12, 11, 10,  9,  8],
       [18, 17, 16, 15, 14, 13, 12, 11, 10,  9],
       [19, 18, 17, 16, 15, 14, 13, 12, 11, 10]])
票数 0
EN

Stack Overflow用户

发布于 2021-03-28 16:19:30

这是一个简单的广播任务:

代码语言:javascript
复制
In [31]: A =np.arange(3); B=np.arange(4)
In [32]: C = B - A[:,None]
In [33]: C.shape
Out[33]: (3, 4)
In [34]: C
Out[34]: 
array([[ 0,  1,  2,  3],
       [-1,  0,  1,  2],
       [-2, -1,  0,  1]])

这就像https://stackoverflow.com/a/66842410/901925的答案,但是没有必要使用repeat。这应该会减少一些内存使用,但是如果M*N*8接近您的内存限制,那么使用C的这个操作或随后的操作可能会达到这个限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66842306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档