เร่งความเร็วอาร์เรย์จำนวนมากต่อกัน [ซ้ำกัน]

ฉันมีรหัสต่อไปนี้ ฉันแปลง cp_X_train จาก RGB เป็นระดับสีเทาและต่อเข้ากับ X_train_gray

X_train_gray = np.empty([0, 32, 32, 1])

start = timer()
for i in range(cp_X_train.shape[0]):
    if i % 1000 == 0:
        print(i)
        end = timer()
        print(end - start)
        start = timer()
    gray_img = cv2.cvtColor(cp_X_train[i], cv2.COLOR_BGR2GRAY)[None, :, :, None]
    X_train_gray = np.concatenate((X_train_gray, gray_img), axis=0)

ฉันพิมพ์เวลาดำเนินการทุกๆ 1,000 ตัวอย่าง

0
0.00042258699977537617
1000
3.331055953000032
2000
9.222047281000414
3000
15.596254615000362
4000
21.37355997799932
5000
27.513121935999152
6000
33.477182841001195
7000
40.4089376539996
8000
47.39131554400046
9000
53.73745651799982

อย่างที่คุณเห็นในช่วงเริ่มต้น เวลาในการประมวลผลมีน้อย แต่เมื่อ X_train_gray มีขนาดใหญ่ขึ้น เวลาในการประมวลผลก็ใหญ่ขึ้น ฉันจะแก้ไขสถานการณ์นี้ได้อย่างไร


person Lion Lai    schedule 31.07.2017    source แหล่งที่มา
comment
คุณไม่สามารถเชื่อมต่อกับรายการ grey_img's ของคุณแล้วโทร np.concatenate ในตอนท้ายได้หรือไม่? ขณะนี้คุณกำลังขยายอาเรย์ซ้ำ ๆ ซึ่งไม่มีประสิทธิภาพ   -  person EdChum    schedule 31.07.2017
comment
คุณสามารถสร้าง X_train_gray เป็นอาร์เรย์ของศูนย์แล้วเขียนทับด้วย X_train_gray[i] = ... หากต้องทราบจำนวนภาพก่อน   -  person blckbird    schedule 31.07.2017
comment
numpy.concatenate ต้องจัดสรรหน่วยความจำสำหรับอาร์เรย์ใหม่ จากนั้นจึงคัดลอกข้อมูลจากอาร์เรย์ที่กำหนดทั้งสองครั้งทุกครั้ง ดังนั้น คุณจะต้องสร้างอาร์เรย์ที่เพิ่มขึ้นใหม่อย่างต่อเนื่อง ซึ่งต้องใช้หน่วยความจำและเวลาจำนวนมาก   -  person ForceBru    schedule 31.07.2017
comment
@EdChum: ฉันรู้ว่าฉันกำลังเติบโต X_train_gray ซ้ำแล้วซ้ำอีก แต่ฉันไม่รู้ว่าจะแก้ไขปัญหานี้อย่างไร ฉันต้องเก็บทุก ๆ grey_img   -  person Lion Lai    schedule 31.07.2017
comment
ประกาศรายการว่างนอกลูปของคุณ ผนวก imgs สีเทาของคุณในลูป หลังจากวนซ้ำ ให้โทร np.concatenate เมื่อผ่านรายการ grey_imgs ของคุณ   -  person EdChum    schedule 31.07.2017
comment
ฉันเข้าใจแล้ว ขอบคุณ   -  person Lion Lai    schedule 31.07.2017