我想从列表中减去列表的每个元素并生成列表列表。 e.g:
x = [1,2,3,4,5]
# expect this
x_sub = [[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]]
在我的情况下,该列表有120,000名成员,因此需要一些有效的东西。目前这是我的代码,但速度非常慢。
import time
import numpy as np
data = np.random.randint(10, size=100000)
allDiffs= []
start = time.time()
# Iterate over each centroid calculating the costs
for i, x in enumerate(data):
diff = [np.abs(data[i]-a) for a in data]
allDiffs.append(diff)
end = time.time()
print(end-start)
答案 0 :(得分:2)
您可以使用numpy.broadcasting
执行此操作:
np.abs(data - data[:,None])
这里发生的是data[:,None]
通过向其添加新轴将数据重新整形为二维数组,data - data[:,None]
将广播两次并生成元素的外部减法。
x = np.array([1,2,3,4,5])
np.abs(x - x[:,None])
#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]])