【问题标题】:Truth value of an array in a for loopfor循环中数组的真值
【发布时间】:2020-11-06 17:01:58
【问题描述】:

我正在编写一个代码来使用 KNN 分析异常值,当我制作矩阵 (70k x 70k) 时,它对于我的 RAM (36GB) 来说太大了,所以我将它们分成 7 个 10k x 10k 元素的矩阵,下一个代码:

matrices = []
for i in range(7):
    matrices.append(np.zeros([10000, 10000]))

for matrix in matrices:
    for i in range(10000 * matrices.index(matrix), 10000 * (matrices.index(matrix) + 1)):
        for j in range(10000 * matrices.index(matrix), 10000 * (matrices.index(matrix) + 1)):
            distance = mt.sqrt((x[i] - x[j]) ** 2 + (y[i] - y[j]) ** 2)
            matrix[i, j] = round(distance, 3)

但是当我运行它时(当然是 25 分钟后),它会显示下一个错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

for i in range(10000 * matrices.index(matrix), 10000 * (matrices.index(matrix) + 1)): 行中我找不到任何关于此的信息,因为我实际上并没有要求真值。

(这是一个硬件,没有时间学习和使用pytables)

【问题讨论】:

  • 最后我把矩阵分成了49个较小的矩阵,分别分析,不是最优化的方法,但是有效,谢谢解答!!

标签: python arrays numpy knn valueerror


【解决方案1】:

请注意,您必须将 70kx70k 矩阵划分为 7x7=49 个 10kx10k 矩阵。除此之外,你的意思是这样做吗?:

matrices = []
for i in range(7):
    for j in range(7):
        matrices.append(np.zeros([10000, 10000]))
    
for i in range(70000):
    for j in range(70000):
        distance = mt.sqrt((x[i] - x[j]) ** 2 + (y[i] - y[j]) ** 2)
        matrices[7*i//10000+j//10000][i%10000, j%10000] = round(distance, 3)

不过,我看不出这与将整个矩阵装入 RAM 有何不同。 matrices 基本上是一样的。最重要的是,numpy 中有一些函数可以将数组分块并计算矩阵的欧几里得距离。您可能想利用它。

【讨论】:

  • 哦,对了,应该是49个矩阵。你在说什么功能?我不认识他们:(
  • 从 scipy 中使用 reshapeview_as_windows 来阻止块数组,并计算距离(还有更多)使用 np.linalg.norm(x-x[:,None],1)(对于 x 和 y)甚至更快,scipy distance 函数。查看stackoverflow.com/questions/1401712/… 了解可用的不同距离函数。尽管如此,我看不出这种分块方式如何让您在 RAM 中逐块运行。您可能需要对其进行分块并将其保存到文件中,以便能够逐个加载并进行计算。
  • @MatiasVidal 请检查stackoverflow.com/help/someone-answers,如果您有任何帖子解决了您的问题,如何接受答案。谢谢。
【解决方案2】:

matrices 是一个列表,matrices.index(matrix) 尝试在该列表中查找对象 matrix。实际上,它将与列表的每个元素进行比较并检查是否if matrix == element: return index。然而,由于 matrix 是一个数组,因此 == 比较会产生另一个 bool-array,它不能被解释为单个 bool 值。

【讨论】:

  • 所以我应该把矩阵做成一个列表?但是我怎样才能让它充满一个元素然后替换它呢?或者我应该使用for i in range(7) 而不是 rhe 索引?
  • @MatiasVidal 我不确定您要使用该代码做什么。你能详细说明一下吗?
  • 我需要一个 70k 点之间的距离矩阵,以便使用 KNN 方法进行比较并研究数据的异常值。
  • @MatiasVidal 所以你只考虑每个 10k 点的子集?那不是一回事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
相关资源
最近更新 更多