【问题标题】:What is the best efficient way to loop through 2d array in Python在Python中循环遍历二维数组的最佳有效方法是什么
【发布时间】:2021-07-16 12:32:33
【问题描述】:

我是 Python 和机器学习的新手。我在互联网上找不到最好的方法。我有一个大的二维数组(distance_matrix.shape= (47, 1328624))。我写了下面的代码,但运行时间太长。 for循环中的for循环太费时间了。

distance_matrix = [[0.21218192, 0.12845819, 0.54545613, 0.92464129, 0.12051526, 0.0870853 ], [0.2168166 , 0.11174682, 0.58193855, 0.93949729, 0.08060061, 0.11963891], [0.23996999, 0.17554854, 0.60833433, 0.93914766, 0.11631545, 0.2036373]]
                    
iskeleler = pd.DataFrame({
    'lat':[40.992752,41.083202,41.173462],
    'lon':[29.023165,29.066652,29.088163],
    'name':['Kadıköy','AnadoluHisarı','AnadoluKavağı']
}, dtype=str)

for i in range(len(distance_matrix)):
    for j in range(len(distance_matrix[0])):
        if distance_matrix[i][j] < 1:
            iskeleler.loc[i,'Address'] = distance_matrix[i][j]
        
print(iskeleler)

为了解释,我共享数组的前 5 行并显示我的数据框。 İskeleler dataframe distance_matrix

“İskeleler”数据框有 47 行。我想通过查看 distance_matrix 中第 i 行中的所有值并添加小于 1 的值,将它们添加到“İskeleler”中第 i 行的“地址”列。我的意思是,如果我们查看第一行distance_matrix 照片,我想添加 0.21218192 + 0.12845819 + 0.54545613 .... 之类的数字,并将它们放在 İskeleler 数据框中第 i 行的“地址”列中。

我的意图是遍历 distance_matrix 并找到一些小于 1 的值。代码花费的时间太长。我怎样才能以更快的方式做到这一点?

【问题讨论】:

  • 使用numpy?您已经导入它。您还想给我们一些实际运行的代码。恕我直言,在第 2、3 和 4 行中使用未初始化的 distance_matrix 以及在第 5 和第 7 行中使用 iskeleler 会产生错误
  • @ThomasWeller 实际上我分享了我的代码,以便您理解它。因为我从互联网上提取了两个阵列。如果我与您分享我初始化的部分,那将是一个很长的帖子。我问的问题实际上是一个理论问题。通过将两个 for 循环放在一起来计算需要很多时间。我什至看不到它的工作原理,因为我的数组太大(这就是我分享它的形状的原因)。我怎么能没有两个循环,实际上这是我的问题。
  • 你想设置iskeleler.loc等于distance_matrix每行最后一个小于1的元素?
  • @MarkSetchell 我编辑了我的帖子来回答你的问题。

标签: python arrays loops multidimensional-array


【解决方案1】:

我认为你的意思是:

import numpy as np

# Set up some dummy data in range 0..100
distance = np.random.rand(47,1328624) * 100.0

# Boolean mask of all values < 1
mLessThan1 = distance<1

# Sum elements <1 across rows 
result = np.sum(distance*mLessThan1, axis=1)

在我的 Mac 上需要 168 毫秒。

In [47]: %timeit res = np.sum(distance*mLessThan1, axis=1)
168 ms ± 914 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

【讨论】:

  • 非常感谢。它工作正常。对不起,如果我花了太长时间告诉你。我不是英语母语人士,我只是习惯了 python。
  • 没问题 - 祝你的项目好运!避免带有大型 Numpy 数组的 for 循环。如果您遇到困难,请回来问另一个问题 - 问题(和答案)是免费的 ?
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2014-01-07
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多