for循环中数组的真值

Truth value of an array in a for loop

我正在编写代码来使用 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)): 中,我找不到任何关于此的内容,因为我实际上并没有要求真值。

(hw的,没有时间学习和使用pytables)

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

请注意,您必须将一个 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 中有一些函数可以将数组分块并计算矩阵的欧氏距离。你可能想利用它。