如何解决合并一维数组列表的更快方法?
我有一个函数distance
,该函数以自然数作为输入并返回长度为199的一维数组。我的目标是合并所有数组distance(0)
,...,{ {1}}。我的代码如下:
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]
,所以我想尽可能地优化。我想寻求一种更快的方式来合并这样的数组。
非常感谢您!
解决方法
如果您只是想计算成对距离:
from scipy.spatial.distance import cdist
dist = cdist(sample[:,:3],sample[:,:3])
当然,您会得到一个具有所有成对距离的对称阵列。要获取result
,可以执行以下操作:
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,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])
result = dist[np.triu_indices(n,k=1)]
415 µs ± 26.4 µs per loop (mean ± std. dev. of 7 runs,100 loops each)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。