在Python

时间:2017-07-30 14:37:00

标签: python list numpy

我想从列表中减去列表的每个元素并生成列表列表。 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)

1 个答案:

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