【问题标题】:How to fix IndexError: invalid index to scalar variable如何修复 IndexError:标量变量的索引无效
【发布时间】:2016-01-03 21:05:40
【问题描述】:

此代码产生错误:

IndexError: invalid index to scalar variable.

在线:results.append(RMSPE(np.expm1(y_train[testcv]), [y[1] for y in y_test]))

如何解决?

import pandas as pd
import numpy as np
from sklearn import ensemble
from sklearn import cross_validation

def ToWeight(y):
    w = np.zeros(y.shape, dtype=float)
    ind = y != 0
    w[ind] = 1./(y[ind]**2)
    return w

def RMSPE(y, yhat):
    w = ToWeight(y)
    rmspe = np.sqrt(np.mean( w * (y - yhat)**2 ))
    return rmspe

forest = ensemble.RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1)

print ("Cross validations")
cv = cross_validation.KFold(len(train), n_folds=5)

results = []
for traincv, testcv in cv:
    y_test = np.expm1(forest.fit(X_train[traincv], y_train[traincv]).predict(X_train[testcv]))
    results.append(RMSPE(np.expm1(y_train[testcv]), [y[1] for y in y_test]))

testcv 是:

[False False False ...,  True  True  True]

【问题讨论】:

  • 最后一行 y[1] 的期望值是多少?您正在迭代 y_test 值,示例值是什么?
  • @Monkey: y_test 值:[6175.36384809 6267.20711569 5783.46657446 ..., 4323.34539658 4332.18318557 3481.93371173]
  • y_test 是 1d;你不能同时迭代和索引。

标签: python numpy pandas


【解决方案1】:

您正在尝试索引标量(不可迭代)值:

[y[1] for y in y_test]
#  ^ this is the problem

当您调用 [y for y in test] 时,您已经在迭代这些值,因此您在 y 中获得了一个值。

您的代码与尝试执行以下操作相同:

y_test = [1, 2, 3]
y = y_test[0] # y = 1
print(y[0]) # this line will fail

我不确定您要在结果数组中添加什么,但您需要删除 [y[1] for y in y_test]

如果您想将 y_test 中的每个 y 附加到结果中,您需要将列表理解进一步扩展为如下内容:

[results.append(..., y) for y in y_test]

或者只使用 for 循环:

for y in y_test:
    results.append(..., y)

【讨论】:

  • 伙计,这是一个救生员!为我解决了一个类似的问题,这让我快哭了!
【解决方案2】:

基本上,1 不是y 的有效索引。如果访问者来自他自己的代码,他应该检查他的y 是否包含他尝试访问的索引(在这种情况下索引是1)。

【讨论】:

    【解决方案3】:

    在 for 中,您有一个迭代,然后对于该循环的每个可能是标量的元素,没有索引。当每个元素都是空数组、单个变量或标量而不是列表或数组时,您不能使用索引。

    【讨论】:

      【解决方案4】:

      YOLO 物体检测

      layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

      不需要在 layer_names[i[0] - 1] 中为 i 编制索引。只需删除它并执行 layer_names[i - 1]

      layer_names = net.getLayerNames() output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]

      它对我有用

      【讨论】:

        【解决方案5】:

        使用暗网代码的人需要在 repo 中编辑 yolo_video.py 文件。`此文件有效,替换为所需的编辑

        # import the necessary packages
        import numpy as np
        import argparse
        import imutils
        import time
        import cv2
        import os
        # construct the argument parse and parse the arguments
        ap = argparse.ArgumentParser()
        ap.add_argument("-i", "--input", required=True,
            help="path to input video")
        ap.add_argument("-o", "--output", required=True,
            help="path to output video")
        ap.add_argument("-y", "--yolo", required=True,
            help="base path to YOLO directory")
        ap.add_argument("-c", "--confidence", type=float, default=0.5,
            help="minimum probability to filter weak detections")
        ap.add_argument("-t", "--threshold", type=float, default=0.3,
            help="threshold when applyong non-maxima suppression")
        args = vars(ap.parse_args())
        
        # load the COCO class labels our YOLO model was trained on
        labelsPath = os.path.sep.join([args["yolo"], "biscuits.names"])
        LABELS = open(labelsPath).read().strip().split("\n")    
        # initialize a list of colors to represent each possible class label
        np.random.seed(42)
        COLORS = np.random.randint(0, 255, size=(len(LABELS), 3),
            dtype="uint8")
        # derive the paths to the YOLO weights and model configuration
        weightsPath = os.path.sep.join([args["yolo"], "yolov4-custom_best.weights"])
        configPath = os.path.sep.join([args["yolo"], "yolov4-custom.cfg"])
        # load our YOLO object detector trained on COCO dataset (80 classes)
        # and determine only the *output* layer names that we need from YOLO
        print("[INFO] loading YOLO from disk...")
        net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
        
        ln = net.getLayerNames()
        print("ln",net)
        ln = [ln[i - 1] for i in net.getUnconnectedOutLayers()]
        
        # initialize the video stream, pointer to output video file, and
        # frame dimensions
        vs = cv2.VideoCapture(args["input"])
        writer = None
        (W, H) = (None, None)
        # try to determine the total number of frames in the video file
        try:
            prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2()\
                else cv2.CAP_PROP_FRAME_COUNT
            total = int(vs.get(prop))
            print("[INFO] {} total frames in video".format(total))
        # an error occurred while trying to determine the total
        # number of frames in the video file
        except:
            print("[INFO] could not determine # of frames in video")
            print("[INFO] no approx. completion time can be provided")
            total = -1
        
        
        
        # loop over frames from the video file stream
        while True:
            # read the next frame from the file
            (grabbed, frame) = vs.read()
            # if the frame was not grabbed, then we have reached the end
            # of the stream
            if not grabbed:
                break
            # if the frame dimensions are empty, grab them
            if W is None or H is None:
                (H, W) = frame.shape[:2]
                # construct a blob from the input frame and then perform a forward
            # pass of the YOLO object detector, giving us our bounding boxes
            # and associated probabilities
            blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416),
                swapRB=True, crop=False)
            net.setInput(blob)
            start = time.time()
            layerOutputs = net.forward(ln)
            end = time.time()
            # initialize our lists of detected bounding boxes, confidences,
            # and class IDs, respectively
            boxes = []
            confidences = []
            classIDs = []
        # loop over each of the layer outputs
            for output in layerOutputs:
                # loop over each of the detections
                for detection in output:
                    # extract the class ID and confidence (i.e., probability)
                    # of the current object detection
                    scores = detection[5:]
                    classID = np.argmax(scores)
                    confidence = scores[classID]
                    # filter out weak predictions by ensuring the detected
                    # probability is greater than the minimum probability
                    if confidence > args["confidence"]:
                        # scale the bounding box coordinates back relative to
                        # the size of the image, keeping in mind that YOLO
                        # actually returns the center (x, y)-coordinates of
                        # the bounding box followed by the boxes' width and
                        # height
                        box = detection[0:4] * np.array([W, H, W, H])
                        (centerX, centerY, width, height) = box.astype("int")
                        # use the center (x, y)-coordinates to derive the top
                        # and and left corner of the bounding box
                        x = int(centerX - (width / 2))
                        y = int(centerY - (height / 2))
                        # update our list of bounding box coordinates,
                        # confidences, and class IDs
                        boxes.append([x, y, int(width), int(height)])
                        confidences.append(float(confidence))
                        classIDs.append(classID)
            # apply non-maxima suppression to suppress weak, overlapping
            # bounding boxes
            idxs = cv2.dnn.NMSBoxes(boxes, confidences, args["confidence"],
                args["threshold"])
            # ensure at least one detection exists
            if len(idxs) > 0:   
                # loop over the indexes we are keeping
                for i in idxs.flatten():
                    # extract the bounding box coordinates
                    (x, y) = (boxes[i][0], boxes[i][1])
                    (w, h) = (boxes[i][2], boxes[i][3])
                    # draw a bounding box rectangle and label on the frame
                    color = [int(c) for c in COLORS[classIDs[i]]]
                    cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
                    text = "{}: {:.4f}".format(LABELS[classIDs[i]],
                        confidences[i])
                    cv2.putText(frame, text, (x, y - 5),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
            # check if the video writer is None
            if writer is None:
                # initialize our video writer
                fourcc = cv2.VideoWriter_fourcc(*"MJPG")
                writer = cv2.VideoWriter(args["output"], fourcc, 30,
                    (frame.shape[1], frame.shape[0]), True)
                # some information on processing single frame
                if total > 0:
                    elap = (end - start)
                    print("[INFO] single frame took {:.4f} seconds".format(elap))
                    print("[INFO] estimated total time to finish: {:.4f}".format(
                        elap * total))
            # write the output frame to disk
            writer.write(frame)
        # release the file pointers
        print("[INFO] cleaning up...")
        writer.release()
        vs.release()`
        

        【讨论】:

          猜你喜欢
          • 2021-01-01
          • 1970-01-01
          • 2020-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多