代码之家  ›  专栏  ›  技术社区  ›  artemis Roberto

numpy-无法广播输入未知错误

  •  0
  • artemis Roberto  · 技术社区  · 6 年前


    line 71, in cross_validation folds[index] = numpy.vstack((folds[index], dataset[jindex])). ValueError: could not broadcast input array from shape (2,8) into shape (8)
    有趣的是,当我打印出我在vstack中尝试使用的两个项目的形状时,它们具有相同的形状 (8,)

    import numpy
    
    def csv_to_array(file):
        # Open the file, and load it in delimiting on the ',' for a comma separated value file
        data = open(file, 'r')
        data = numpy.loadtxt(data, delimiter=',')
    
        # Loop through the data in the array
        for index in range(len(data)):
            # Utilize a try catch to try and convert to float, if it can't convert to float, converts to 0
            try:
                data[index] = [float(x) for x in data[index]]
            except Exception:
                data[index] = 0
            except ValueError:
                data[index] = 0
    
        # Return the now type-formatted data
        return data
    
    def create_folds(dataset):
        length = len(dataset)
        folds = numpy.empty_like(dataset)
        for index in range(5):
            tempArray = numpy.ndarray(shape=(1, length))
            numpy.append(folds, tempArray)
            temp_class_array = numpy.ndarray(shape=(1,1))
            numpy.append(folds, temp_class_array)
    
        return folds
    
    def class_distribution(dataset):
        dataset = numpy.asarray(dataset)
        num_total_rows = dataset.shape[0]
        num_columns = dataset.shape[1]
        classes = dataset[:,num_columns-1]
        classes = numpy.unique(classes)
        class_weights = []
    
        for aclass in classes:
            total = 0
            weight = 0
            for row in dataset:
                if numpy.array_equal(aclass, row[-1]):
                    total = total + 1
                else:
                    continue
            weight = float((total/num_total_rows))
            class_weights.append(weight)
    
        class_weights = numpy.asarray(class_weights)
        return classes, class_weights
    
    def cross_validation(dataset):
        classes, class_weights = class_distribution(dataset)
        total_length = len(dataset)
        folds = create_folds(dataset)
        added_so_far = 0
    
        for a_class, a_class_weight in zip(classes, class_weights):
            amt_for_fold = float(((a_class_weight * total_length) / 5)-1)
    
            for index in range(0,10,2):
                added = 0
                for jindex in range(len(classes)):
                    if added >= amt_for_fold:
                        break
                    if classes[jindex] == a_class:
                        print(folds[index].shape)
                        print(dataset[jindex].shape)
                        folds[index] = numpy.vstack((folds[index], dataset[jindex]))
                        # print(folds)
                        folds[index + 1] = numpy.vstack((folds[index + 1], [classes[jindex]]))
    
                        if index < 8:
                            dataset = numpy.delete(dataset, jindex, 0)
                            classes = numpy.delete(classes, jindex, 0)
    
                        added_so_far = added_so_far + 1
    
        for xindex in range(len(folds)):
            folds[xindex] = numpy.delete(folds[xindex], 0, 0)
    
        print(folds)
        return folds
    
    def main():
        print("BEGINNING CFV")
        ecoli = csv_to_array('Classification/ecoli.csv')
        cross_validation(ecoli)
    
    
    
    main()
    

    在以下数据集上:

    0.61,0.45,0.48,0.5,0.48,0.35,0.41,0
    0.17,0.38,0.48,0.5,0.45,0.42,0.5,0
    0.44,0.35,0.48,0.5,0.55,0.55,0.61,0
    0.43,0.4,0.48,0.5,0.39,0.28,0.39,0
    0.42,0.35,0.48,0.5,0.58,0.15,0.27,0
    0.23,0.33,0.48,0.5,0.43,0.33,0.43,0
    0.37,0.52,0.48,0.5,0.42,0.42,0.36,0
    0.29,0.3,0.48,0.5,0.45,0.03,0.17,0
    0.22,0.36,0.48,0.5,0.35,0.39,0.47,0
    0.23,0.58,0.48,0.5,0.37,0.53,0.59,0
    0.47,0.47,0.48,0.5,0.22,0.16,0.26,0
    0.54,0.47,0.48,0.5,0.28,0.33,0.42,0
    0.51,0.37,0.48,0.5,0.35,0.36,0.45,0
    0.4,0.35,0.48,0.5,0.45,0.33,0.42,0
    0.44,0.34,0.48,0.5,0.3,0.33,0.43,0
    0.44,0.49,0.48,0.5,0.39,0.38,0.4,0
    0.43,0.32,0.48,0.5,0.33,0.45,0.52,0
    0.49,0.43,0.48,0.5,0.49,0.3,0.4,0
    0.47,0.28,0.48,0.5,0.56,0.2,0.25,0
    0.32,0.33,0.48,0.5,0.6,0.06,0.2,0
    0.34,0.35,0.48,0.5,0.51,0.49,0.56,0
    0.35,0.34,0.48,0.5,0.46,0.3,0.27,0
    0.38,0.3,0.48,0.5,0.43,0.29,0.39,0
    0.38,0.44,0.48,0.5,0.43,0.2,0.31,0
    0.41,0.51,0.48,0.5,0.58,0.2,0.31,0
    0.34,0.42,0.48,0.5,0.41,0.34,0.43,0
    0.51,0.49,0.48,0.5,0.53,0.14,0.26,0
    0.25,0.51,0.48,0.5,0.37,0.42,0.5,0
    0.29,0.28,0.48,0.5,0.5,0.42,0.5,0
    0.25,0.26,0.48,0.5,0.39,0.32,0.42,0
    0.24,0.41,0.48,0.5,0.49,0.23,0.34,0
    0.17,0.39,0.48,0.5,0.53,0.3,0.39,0
    0.04,0.31,0.48,0.5,0.41,0.29,0.39,0
    0.61,0.36,0.48,0.5,0.49,0.35,0.44,0
    0.34,0.51,0.48,0.5,0.44,0.37,0.46,0
    0.28,0.33,0.48,0.5,0.45,0.22,0.33,0
    0.4,0.46,0.48,0.5,0.42,0.35,0.44,0
    0.23,0.34,0.48,0.5,0.43,0.26,0.37,0
    0.37,0.44,0.48,0.5,0.42,0.39,0.47,0
    0,0.38,0.48,0.5,0.42,0.48,0.55,0
    0.39,0.31,0.48,0.5,0.38,0.34,0.43,0
    0.3,0.44,0.48,0.5,0.49,0.22,0.33,0
    0.27,0.3,0.48,0.5,0.71,0.28,0.39,0
    0.17,0.52,0.48,0.5,0.49,0.37,0.46,0
    0.36,0.42,0.48,0.5,0.53,0.32,0.41,0
    0.3,0.37,0.48,0.5,0.43,0.18,0.3,0
    0.26,0.4,0.48,0.5,0.36,0.26,0.37,0
    0.4,0.41,0.48,0.5,0.55,0.22,0.33,0
    0.22,0.34,0.48,0.5,0.42,0.29,0.39,0
    0.44,0.35,0.48,0.5,0.44,0.52,0.59,0
    0.27,0.42,0.48,0.5,0.37,0.38,0.43,0
    0.16,0.43,0.48,0.5,0.54,0.27,0.37,0
    0.06,0.61,0.48,0.5,0.49,0.92,0.37,1
    0.44,0.52,0.48,0.5,0.43,0.47,0.54,1
    0.63,0.47,0.48,0.5,0.51,0.82,0.84,1
    0.23,0.48,0.48,0.5,0.59,0.88,0.89,1
    0.34,0.49,0.48,0.5,0.58,0.85,0.8,1
    0.43,0.4,0.48,0.5,0.58,0.75,0.78,1
    0.46,0.61,0.48,0.5,0.48,0.86,0.87,1
    0.27,0.35,0.48,0.5,0.51,0.77,0.79,1
    0.52,0.39,0.48,0.5,0.65,0.71,0.73,1
    0.29,0.47,0.48,0.5,0.71,0.65,0.69,1
    0.55,0.47,0.48,0.5,0.57,0.78,0.8,1
    0.12,0.67,0.48,0.5,0.74,0.58,0.63,1
    0.4,0.5,0.48,0.5,0.65,0.82,0.84,1
    0.73,0.36,0.48,0.5,0.53,0.91,0.92,1
    0.84,0.44,0.48,0.5,0.48,0.71,0.74,1
    0.48,0.45,0.48,0.5,0.6,0.78,0.8,1
    0.54,0.49,0.48,0.5,0.4,0.87,0.88,1
    0.48,0.41,0.48,0.5,0.51,0.9,0.88,1
    0.5,0.66,0.48,0.5,0.31,0.92,0.92,1
    0.72,0.46,0.48,0.5,0.51,0.66,0.7,1
    0.47,0.55,0.48,0.5,0.58,0.71,0.75,1
    0.33,0.56,0.48,0.5,0.33,0.78,0.8,1
    0.64,0.58,0.48,0.5,0.48,0.78,0.73,1
    0.11,0.5,0.48,0.5,0.58,0.72,0.68,1
    0.31,0.36,0.48,0.5,0.58,0.94,0.94,1
    0.68,0.51,0.48,0.5,0.71,0.75,0.78,1
    0.69,0.39,0.48,0.5,0.57,0.76,0.79,1
    0.52,0.54,0.48,0.5,0.62,0.76,0.79,1
    0.46,0.59,0.48,0.5,0.36,0.76,0.23,1
    0.36,0.45,0.48,0.5,0.38,0.79,0.17,1
    0,0.51,0.48,0.5,0.35,0.67,0.44,1
    0.1,0.49,0.48,0.5,0.41,0.67,0.21,1
    0.3,0.51,0.48,0.5,0.42,0.61,0.34,1
    0.61,0.47,0.48,0.5,0,0.8,0.32,1
    0.63,0.75,0.48,0.5,0.64,0.73,0.66,1
    0.71,0.52,0.48,0.5,0.64,1,0.99,1
    0.72,0.42,0.48,0.5,0.65,0.77,0.79,2
    0.79,0.41,0.48,0.5,0.66,0.81,0.83,2
    0.83,0.48,0.48,0.5,0.65,0.76,0.79,2
    0.69,0.43,0.48,0.5,0.59,0.74,0.77,2
    0.79,0.36,0.48,0.5,0.46,0.82,0.7,2
    0.78,0.33,0.48,0.5,0.57,0.77,0.79,2
    0.75,0.37,0.48,0.5,0.64,0.7,0.74,2
    0.59,0.29,0.48,0.5,0.64,0.75,0.77,2
    0.67,0.37,0.48,0.5,0.54,0.64,0.68,2
    0.66,0.48,0.48,0.5,0.54,0.7,0.74,2
    0.64,0.46,0.48,0.5,0.48,0.73,0.76,2
    0.76,0.71,0.48,0.5,0.5,0.71,0.75,2
    0.84,0.49,0.48,0.5,0.55,0.78,0.74,2
    0.77,0.55,0.48,0.5,0.51,0.78,0.74,2
    0.81,0.44,0.48,0.5,0.42,0.67,0.68,2
    0.58,0.6,0.48,0.5,0.59,0.73,0.76,2
    0.63,0.42,0.48,0.5,0.48,0.77,0.8,2
    0.62,0.42,0.48,0.5,0.58,0.79,0.81,2
    0.86,0.39,0.48,0.5,0.59,0.89,0.9,2
    0.81,0.53,0.48,0.5,0.57,0.87,0.88,2
    0.87,0.49,0.48,0.5,0.61,0.76,0.79,2
    0.47,0.46,0.48,0.5,0.62,0.74,0.77,2
    0.76,0.41,0.48,0.5,0.5,0.59,0.62,2
    0.7,0.53,0.48,0.5,0.7,0.86,0.87,2
    0.64,0.45,0.48,0.5,0.67,0.61,0.66,2
    0.81,0.52,0.48,0.5,0.57,0.78,0.8,2
    0.73,0.26,0.48,0.5,0.57,0.75,0.78,2
    0.49,0.61,1,0.5,0.56,0.71,0.74,2
    0.88,0.42,0.48,0.5,0.52,0.73,0.75,2
    0.84,0.54,0.48,0.5,0.75,0.92,0.7,2
    0.63,0.51,0.48,0.5,0.64,0.72,0.76,2
    0.86,0.55,0.48,0.5,0.63,0.81,0.83,2
    0.79,0.54,0.48,0.5,0.5,0.66,0.68,2
    0.57,0.38,0.48,0.5,0.06,0.49,0.33,2
    0.78,0.44,0.48,0.5,0.45,0.73,0.68,2
    0.78,0.68,0.48,0.5,0.83,0.4,0.29,3
    0.63,0.69,0.48,0.5,0.65,0.41,0.28,3
    0.67,0.88,0.48,0.5,0.73,0.5,0.25,3
    0.61,0.75,0.48,0.5,0.51,0.33,0.33,3
    0.67,0.84,0.48,0.5,0.74,0.54,0.37,3
    0.74,0.9,0.48,0.5,0.57,0.53,0.29,3
    0.73,0.84,0.48,0.5,0.86,0.58,0.29,3
    0.75,0.76,0.48,0.5,0.83,0.57,0.3,3
    0.77,0.57,0.48,0.5,0.88,0.53,0.2,3
    0.74,0.78,0.48,0.5,0.75,0.54,0.15,3
    0.68,0.76,0.48,0.5,0.84,0.45,0.27,3
    0.56,0.68,0.48,0.5,0.77,0.36,0.45,3
    0.65,0.51,0.48,0.5,0.66,0.54,0.33,3
    0.52,0.81,0.48,0.5,0.72,0.38,0.38,3
    0.64,0.57,0.48,0.5,0.7,0.33,0.26,3
    0.6,0.76,1,0.5,0.77,0.59,0.52,3
    0.69,0.59,0.48,0.5,0.77,0.39,0.21,3
    0.63,0.49,0.48,0.5,0.79,0.45,0.28,3
    0.71,0.71,0.48,0.5,0.68,0.43,0.36,3
    0.68,0.63,0.48,0.5,0.73,0.4,0.3,3
    0.74,0.49,0.48,0.5,0.42,0.54,0.36,4
    0.7,0.61,0.48,0.5,0.56,0.52,0.43,4
    0.66,0.86,0.48,0.5,0.34,0.41,0.36,4
    0.73,0.78,0.48,0.5,0.58,0.51,0.31,4
    0.65,0.57,0.48,0.5,0.47,0.47,0.51,4
    0.72,0.86,0.48,0.5,0.17,0.55,0.21,4
    0.67,0.7,0.48,0.5,0.46,0.45,0.33,4
    0.67,0.81,0.48,0.5,0.54,0.49,0.23,4
    0.67,0.61,0.48,0.5,0.51,0.37,0.38,4
    0.63,1,0.48,0.5,0.35,0.51,0.49,4
    0.57,0.59,0.48,0.5,0.39,0.47,0.33,4
    0.71,0.71,0.48,0.5,0.4,0.54,0.39,4
    0.66,0.74,0.48,0.5,0.31,0.38,0.43,4
    0.67,0.81,0.48,0.5,0.25,0.42,0.25,4
    0.64,0.72,0.48,0.5,0.49,0.42,0.19,4
    0.68,0.82,0.48,0.5,0.38,0.65,0.56,4
    0.32,0.39,0.48,0.5,0.53,0.28,0.38,4
    0.7,0.64,0.48,0.5,0.47,0.51,0.47,4
    0.63,0.57,0.48,0.5,0.49,0.7,0.2,4
    0.69,0.65,0.48,0.5,0.63,0.48,0.41,4
    0.43,0.59,0.48,0.5,0.52,0.49,0.56,4
    0.74,0.56,0.48,0.5,0.47,0.68,0.3,4
    0.71,0.57,0.48,0.5,0.48,0.35,0.32,4
    0.61,0.6,0.48,0.5,0.44,0.39,0.38,4
    0.59,0.61,0.48,0.5,0.42,0.42,0.37,4
    0.74,0.74,0.48,0.5,0.31,0.53,0.52,4
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   fountainhead    6 年前

    这个 vstack() (2,8) 阵列。

    (2,8个) folds[index] ,这只是一个形状 (8,) 阵列。

    numpy试图看看这样一个不匹配的赋值是否可以通过广播来证明,受广播的规则和约束的约束,并且最终放弃了这个错误消息。

    不知道你的真正意图是什么,所以我不能提出其他的选择。

    我猜是的 folds 实际上应该创建为一个3d数组,其中每个内部2d数组的行数与每个折叠的长度相等。

    我也有这样的怀疑 folds = numpy.empty_like(dataset) 是基于对 numpy.empty_like() . 请再检查一遍。

        2
  •  1
  •   John Sloper    6 年前

    我想你可能误解了vstack的作用。给定两个8项向量,它将它们垂直叠加,得到一个2x8矩阵。实际上,输出将始终位于lead 2D https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

    例如。

    a = np.array([1,2,3])
    b = np.array([1,2,3])
    np.vstack((a,b))
    

    输出

    array([[1, 2, 3],
           [1, 2, 3]])