我有一个m-dimensional NumPy数组A和一个n-dimensional NumPy数组B
我想要创建一个m x n矩阵C,这样C[i, j] = B[j] - A[i]
在NumPy中是否有一种高效/矢量化的方法来做到这一点?
目前我正在使用:
C = np.zeros((M, N))
for i in range(0, M):
C[i, :] = (B - A[i])编辑:
m, n是大数,因此,C是一个更大的矩阵( m*n条目)。
我试过np.repeat和np.subtract.outer,但它们都让我的内存崩溃
发布于 2021-03-28 14:17:17
我想你是在找ǹp.subtract.outer
M = 5
N = 10
A = np.arange(N)
B = np.arange(M)
np.subtract.outer(A,B)产出:
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维,它等价于
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关键字之前分配输出缓冲区:
C = np.zeros((M, N))
np.subtract.outer(B, A, out=C)发布于 2021-03-28 14:19:40
您可以在新轴上重复其中一个数组,然后减去另一个数组。
示例:
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将包含:
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]])发布于 2021-03-28 16:19:30
这是一个简单的广播任务:
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的这个操作或随后的操作可能会达到这个限制。
https://stackoverflow.com/questions/66842306
复制相似问题