Arrays 合并一维阵列列表的更快方法?

Arrays 合并一维阵列列表的更快方法?,arrays,python-3.x,list,numpy,array-merge,Arrays,Python 3.x,List,Numpy,Array Merge,我有一个函数distance,它将一个自然数作为输入,并返回长度为199的一维数组。我的目标是合并所有数组distance(0),…,distance(499)。我的代码如下: import numpy as np np.random.seed(42) n = 200 d = 500 sample = np.random.uniform(size = [n, d]) def distance(i): value = list(sample[i, 0:3]) temp = v

我有一个函数
distance
,它将一个自然数作为输入,并返回长度为199的一维数组。我的目标是合并所有数组
distance(0)
,…,
distance(499)
。我的代码如下:

import numpy as np 

np.random.seed(42)
n = 200
d = 500
sample = np.random.uniform(size = [n, d])

def distance(i):
    value = list(sample[i, 0:3])
    temp = value - sample[(i + 1):n, 0:3]
    return np.sqrt(np.sum(temp**2, axis = 1))

temp = [distance(i) for i in range(n - 1)]
result = [j for i in temp for j in i]
因为我使用大型
d
,所以我希望尽可能地优化。我想寻求一种更快的方法来合并这样的数组


非常感谢你

如果您只是试图计算成对距离:

from scipy.spatial.distance import cdist
dist = cdist(sample[:,:3], sample[:,:3])
当然,你会得到一个对称的数组,所有的两两距离。要获得
结果
,您可以执行以下操作:

result = dist[np.triu_indices(n,k=1)]

关于广播评论,
cdist
将做类似的事情:

dist = np.sum((sample[None,:,:3]-sample[:,None,:3])**2, axis=-1)**0.5

以下是每个系统的运行时间,以供参考:

%%timeit -n 100
temp = [distance(i) for i in range(n - 1)]
result = [j for i in temp for j in i]
6.41 ms ± 197 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit -n 100
temp = [distance(i) for i in range(n - 1)]
result = np.hstack(temp)
4.86 ms ± 295 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit -n 100
temp = [distance(i) for i in range(n - 1)]
result = np.concatenate(temp)
4.28 ms ± 175 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit -n 100
dist = np.sum((sample[None,:,:3]-sample[:,None,:3])**2, axis=-1)**0.5
result = dist[np.triu_indices(n,k=1)]
1.47 ms ± 61 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


%%timeit -n 100
dist = cdist(sample[:,:3], sample[:,:3])
result = dist[np.triu_indices(n,k=1)]
415 µs ± 26.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

np.hstack(temp)
有帮助吗?@hpaulj
np.hstack(temp)
的语法更清晰,但它的速度与
[j代表i,temp代表j代表i]
大致相同。您是否在尝试计算成对距离?或者它只是一个模型示例?@hpaulj,因为
np.hstack
来自于包numpy,并进行了有效优化。我觉得很难再好了^^^@Quanghaang你说得很对。我试图计算超立方体中的成对距离。我很惊讶,即使我把代码简化了这么多,你还是算出了我的目标。哇哇哇,你的
scipy.space.distance
解决方案将总时间从
12.60349082967773
减少到
1.9831750392913818
。真是太棒了。你总是能想出优雅的解决方案。这太棒了。^^请问你如何为每个命令生成计时并获得这样的结果显示?@LAD
%%timeit
是Jupyter中的神奇命令。上面的每个块都是一个单独的单元格,有它的输出。非常感谢您的解释!