numpy中用一维数组创建一个nxn的方阵最快的方法是什么?

3
假设有以下NumPy数组:
arr = np.array([0, 1, 2, 3, 4]) # can be any array

我想知道生成以下操作的最快方法:

n = arr.shape[0]
result = np.tile(arr, (n, 1)) - arr.reshape((-1, 1))
print(result):

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]])

(1) 如何高效地创建矩阵"result"(因为n >> 0可能非常大)?

(2) 这个矩阵有特定的名称吗?


1
这个矩阵有特定的名称吗?对角线为常数的矩阵被称为Toeplitz矩阵。我不知道您创建的特殊情况是否有特殊名称。 - Warren Weckesser
请参见scipy.linalg.toeplitz - Warren Weckesser
@Warren Weckesser 那看起来像是另一个操作... - Kelly Bundy
@isedgar 你的输入数组是否总是像那样是1到n的数字,还是只是一个误导性的例子?如果总是这样,我会期望输入只是数字n。 - Kelly Bundy
@Kelly Bundy 不,这只是一个玩具示例。 - isedgar
你能否让你的例子更清晰一些,比如把3改成30?正如你所看到的,由于答案不相等,你想要什么并不完全清楚。 - Kelly Bundy
1个回答

6

这个稍微快一些:

result = arr-arr[:,None]

快速的基准测试,不是科学的。(使用arr进行100次timeit计时)
          5 items (arr) 100 times   10,000 items (np.arange) once
OP:       0.0006383560000000066     0.7902513520000001
This one: 0.0001735200000000381     0.3640661519999999
Kelly's:  0.00027326299999996806    0.36036748900000015 (see comments)

2
np.subtract.outer(-arr, -arr)怎么样?(我在手机上,编写基准测试很不方便,而且我假设你已经有了一个。) - Kelly Bundy
1
@Kelly,它比我的慢50%,但仍然比原帖快两倍以上。 - Alain T.
谢谢。您测试了什么 n 值? - Kelly Bundy
1
@Kelly,我只测试了arr和np.arange(10000),你的速度快1%。 - Alain T.
1
@ Kelly,确实,您的解决方案随着n的增加逐步领先(在n = 20K时快3%,我没有耐心等待更高的值,但显然有一个趋势 :) - Alain T.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接