【问题标题】:Python: Calculate percentage of coordinates in relation to surrounding coordinatesPython:计算坐标相对于周围坐标的百分比
【发布时间】:2017-06-09 13:00:37
【问题描述】:

我有一个字典,其中 3D 元组坐标作为键,字符串分数作为值。现在我想获得一个新的坐标列表/字典/数组,它应该是 12x12x12 框中坐标和所有周围坐标的百分比值。有没有比我第一种方法从字典中获取坐标更快的方法? (sparse1 是具有原始坐标的字典)。在代码中,sparse1 只是从一个 Tube 中提取坐标(因为我不知道如何在这里添加更多字符 :():

import numpy as np
import itertools


sparse1 = {(32.0, 291.0, 3.0): ['-2'], (16.0, 299.0, 23.0): ['-2'], (22.0, 303.0, 24.0): ['2'], (30.0, 296.0, 16.0): ['1'], (27.0, 305.0, 10.0): ['1'], (21.0, 290.0, 16.0): ['2'], (27.0, 295.0, 15.0): ['-2'], (36.0, 293.0, -2.0): ['2'], (37.0, 292.0, 5.0): ['2'], (24.0, 312.0, 18.0): ['2'], (21.0, 307.0, 25.0): ['-2'], (20.0, 304.0, 17.0): ['1'], (26.0, 291.0, 18.0): ['-2'], (17.0, 308.0, 10.0): ['2'], (32.0, 313.0, 11.0): ['2'], (32.0, 303.0, 6.0): ['-2'], (25.0, 294.0, 10.0): ['2'], (22.0, 299.0, 19.0): ['2'], (24.0, 293.0, 2.0): ['-2'], (20.0, 303.0, 20.0): ['2'], (20.0, 293.0, 3.0): ['2'], (19.0, 298.0, 28.0): ['-2'], (29.0, 297.0, -1.0): ['2'], (31.0, 310.0, 11.0): ['-2'], (22.0, 300.0, 26.0): ['2'], (21.0, 311.0, 14.0): ['2'], (35.0, 306.0, 13.0): ['2'], (15.0, 308.0, 14.0): ['2'], (27.0, 296.0, 21.0): ['2'], (28.0, 289.0, 0.0): ['2'], (18.0, 309.0, 9.0): ['2'], (31.0, 297.0, 1.0): ['2'], (23.0, 312.0, 15.0): ['2'], (26.0, 295.0, 13.0): ['-2'], (30.0, 302.0, 9.0): ['1'], (16.0, 301.0, 26.0): ['-2'], (29.0, 307.0, 17.0): ['2'], (24.0, 299.0, 18.0): ['2'], (32.0, 290.0, -3.0): ['2'], (12.0, 301.0, 27.0): ['2'], (33.0, 311.0, 11.0): ['1'], (20.0, 291.0, 19.0): ['2'], (26.0, 310.0, 12.0): ['2'], (21.0, 305.0, 6.0): ['1'], (36.0, 289.0, 12.0): ['2'], (23.0, 290.0, 1.0): ['2'], (20.0, 306.0, 30.0): ['2'], (30.0, 308.0, 2.0): ['1'], (15.0, 296.0, 25.0): ['-2'], (28.0, 293.0, 11.0): ['-2'], (31.0, 301.0, 6.0): ['2'], (17.0, 298.0, 29.0): ['1'], (32.0, 289.0, 1.0): ['-2'], (25.0, 292.0, 17.0): ['-2'], (23.0, 307.0, 24.0): ['-2'], (21.0, 292.0, 22.0): ['1'], (27.0, 293.0, 9.0): ['2'], (26.0, 304.0, 0.0): ['2'], (20.0, 295.0, 14.0): ['2'], (25.0, 309.0, 24.0): ['2'], (24.0, 310.0, 16.0): ['-2'], (21.0, 309.0, 27.0): ['1'], (14.0, 306.0, 23.0): ['-2'], (23.0, 294.0, 12.0): ['2'], (20.0, 310.0, 19.0): ['-2'], (30.0, 309.0, 12.0): ['-2'], (33.0, 302.0, 12.0): ['2'], (26.0, 293.0, 20.0): ['1'], (30.0, 294.0, 19.0): ['2'], (25.0, 288.0, 12.0): ['2'], (29.0, 305.0, 14.0): ['2'], (24.0, 291.0, 4.0): ['2'], (33.0, 309.0, 4.0): ['2'], (28.0, 294.0, -1.0): ['-2'], (20.0, 301.0, 22.0): ['2'], (32.0, 310.0, 12.0): ['-2'], (19.0, 296.0, 30.0): ['2'], (25.0, 305.0, 21.0): ['2'], (22.0, 292.0, 4.0): ['2'], (30.0, 307.0, 1.0): ['1'], (34.0, 303.0, 7.0): ['1'], (28.0, 295.0, 6.0): ['2'], (18.0, 311.0, 11.0): ['2'], (31.0, 303.0, 3.0): ['1'], (30.0, 296.0, 11.0): ['1'], (16.0, 299.0, 28.0): ['-2'], (35.0, 289.0, 10.0): ['-2'], (13.0, 304.0, 29.0): ['2'], (29.0, 309.0, 19.0): ['2'], (25.0, 291.0, -1.0): ['2'], (24.0, 297.0, 16.0): ['1'], (27.0, 295.0, 6.0): ['2'], (33.0, 305.0, 9.0): ['-2'], (26.0, 296.0, 14.0): ['1'], (29.0, 295.0, 2.0): ['-2'], (22.0, 298.0, 26.0): ['1'], (18.0, 293.0, 19.0): ['2'], (29.0, 296.0, 13.0): ['1'], (18.0, 305.0, 27.0): ['-2'], (19.0, 309.0, 16.0): ['-2'], (31.0, 291.0, 4.0): ['-2'], (25.0, 294.0, 19.0): ['-2'], (22.0, 299.0, 28.0): ['2'], (24.0, 293.0, 11.0): ['2'], (21.0, 294.0, 20.0): ['-2'], (27.0, 291.0, 11.0): ['-2'], (26.0, 306.0, 6.0): ['-2'], (19.0, 298.0, 21.0): ['-2'], (29.0, 294.0, 0.0): ['-2'], (24.0, 308.0, 22.0): ['-2'], (30.0, 305.0, 8.0): ['-2'], (14.0, 300.0, 21.0): ['2'], (37.0, 293.0, -1.0): ['2'], (23.0, 292.0, 14.0): ['1'], (29.0, 290.0, 17.0): ['2'], (20.0, 308.0, 13.0): ['-2'], (33.0, 296.0, 10.0): ['2'], (26.0, 295.0, 22.0): ['2'], (30.0, 306.0, 7.0): ['-2'], (17.0, 304.0, 14.0): ['2'], (30.0, 302.0, 0.0): ['2'], (25.0, 290.0, 14.0): ['-2'], (29.0, 307.0, 8.0): ['-2'], (31.0, 308.0, 3.0): ['1'], (28.0, 293.0, 8.0): ['2'], (37.0, 287.0, 5.0): ['2'], (20.0, 291.0, 24.0): ['2'], (35.0, 294.0, 7.0): ['2'], (32.0, 308.0, 10.0): ['-2'], (29.0, 293.0, 2.0): ['-2'], (19.0, 294.0, 16.0): ['2'], (25.0, 307.0, 11.0): ['-2'], (22.0, 294.0, 2.0): ['-2'], (21.0, 305.0, 9.0): ['-2'], (27.0, 310.0, 20.0): ['2'], (18.0, 303.0, 14.0): ['2'], (28.0, 293.0, 4.0): ['-2'], (29.0, 296.0, -2.0): ['2'], (23.0, 307.0, 19.0): ['-2'], (28.0, 294.0, 10.0): ['1'], (27.0, 293.0, 0.0): ['-2'], (33.0, 307.0, 7.0): ['-2'], (26.0, 304.0, 11.0): ['1'], (20.0, 295.0, 23.0): ['-2'], (25.0, 309.0, 3.0): ['2'], (36.0, 293.0, 8.0): ['2'], (23.0, 294.0, 5.0): ['1'], (29.0, 298.0, 15.0): ['2'], (28.0, 291.0, 16.0): ['-2'], (15.0, 300.0, 29.0): ['1'], (19.0, 307.0, 18.0): ['-2'], (31.0, 289.0, 2.0): ['-2'], (29.0, 297.0, -2.0): ['2'], (35.0, 293.0, 4.0): ['1'], (29.0, 305.0, 1.0): ['1'], (25.0, 293.0, -3.0): ['2'], (24.0, 291.0, 13.0): ['1'], (28.0, 306.0, 9.0): ['-2'], (26.0, 308.0, 4.0): ['1'], (17.0, 295.0, 24.0): ['-2'], (32.0, 310.0, 7.0): ['2'], (19.0, 296.0, 23.0): ['-2'], (16.0, 298.0, 20.0): ['2'], (24.0, 306.0, 20.0): ['-2'], (30.0, 307.0, 10.0): ['-2'], (23.0, 298.0, 0.0): ['1'], (29.0, 302.0, 2.0): ['1'], (30.0, 305.0, 3.0): ['-2'], (31.0, 293.0, 7.0): ['1'], (17.0, 306.0, 12.0): ['2'], (30.0, 296.0, 2.0): ['-2'], (32.0, 297.0, 0.0): ['2'], (24.0, 298.0, -1.0): ['1'], (35.0, 289.0, 1.0): ['-2'], (29.0, 309.0, 10.0): ['-2'], (12.0, 307.0, 26.0): ['2'], (28.0, 310.0, 18.0): ['1'], (26.0, 294.0, -3.0): ['2'], (33.0, 295.0, -2.0): ['2'], (26.0, 296.0, 1.0): ['-2'], (32.0, 306.0, 8.0): ['-2'], (19.0, 292.0, 18.0): ['2'], (25.0, 301.0, 9.0): ['2'], (22.0, 298.0, 17.0): ['1'], (21.0, 307.0, 15.0): ['-2'], (21.0, 295.0, 25.0): ['-2'], (29.0, 296.0, 18.0): ['2'], (15.0, 302.0, 20.0): ['2'], (21.0, 310.0, 20.0): ['-2'], (31.0, 291.0, 15.0): ['-2'], (17.0, 308.0, 24.0): ['-2'], (30.0, 292.0, 7.0): ['1'], (24.0, 297.0, 26.0): ['2'], (23.0, 305.0, 21.0): ['-2'], (13.0, 308.0, 25.0): ['1'], (27.0, 291.0, 2.0): ['-2'], (27.0, 297.0, 15.0): ['2'], (26.0, 306.0, 13.0): ['2'], (20.0, 293.0, 21.0): ['-2'], (26.0, 294.0, 23.0): ['2'], (16.0, 294.0, 25.0): ['1'], (35.0, 286.0, 5.0): ['1'], (38.0, 292.0, 3.0): ['2'], (19.0, 305.0, 12.0): ['-2'], (31.0, 295.0, 0.0): ['-2'], (21.0, 312.0, 23.0): ['2'], (35.0, 291.0, 6.0): ['-2'], (16.0, 307.0, 15.0): ['1'], (29.0, 307.0, 7.0): ['-2'], (24.0, 289.0, 15.0): ['2'], (15.0, 307.0, 30.0): ['2'], (31.0, 286.0, 8.0): ['1'], (19.0, 294.0, 25.0): ['1'], (25.0, 307.0, 2.0): ['1'], (22.0, 294.0, 25.0): ['1'], (24.0, 304.0, 10.0): ['-2'], (27.0, 310.0, 13.0): ['1'], (23.0, 296.0, 2.0): ['-2'], (20.0, 306.0, 8.0): ['-2'], (21.0, 308.0, 24.0): ['-2'], (22.0, 305.0, 18.0): ['1'], (34.0, 306.0, 3.0): ['2'], (23.0, 307.0, 10.0): ['-2'], (34.0, 288.0, 11.0): ['-2'], (12.0, 305.0, 24.0): ['2'], (18.0, 296.0, 23.0): ['-2'], (33.0, 307.0, 14.0): ['2'], (20.0, 295.0, 28.0): ['2'], (32.0, 304.0, 6.0): ['-2'], (25.0, 309.0, 10.0): ['1'], (22.0, 290.0, 14.0): ['2'], (21.0, 309.0, 13.0): ['-2'], (27.0, 306.0, 16.0): ['-2'], (21.0, 303.0, 6.0): ['2'], (23.0, 294.0, 18.0): ['-2'], (15.0, 300.0, 22.0): ['-2'], (19.0, 307.0, 29.0): ['1'], (31.0, 289.0, 9.0): ['-2'], (17.0, 310.0, 26.0): ['-2'], (30.0, 294.0, 1.0): ['-2'], (23.0, 311.0, 23.0): ['2'], (13.0, 310.0, 27.0): ['2'], (28.0, 306.0, 0.0): ['1'], (27.0, 289.0, 12.0): ['1'], (26.0, 308.0, 15.0): ['-2'], (36.0, 286.0, 5.0): ['2'], (26.0, 302.0, 4.0): ['1'], (25.0, 305.0, 7.0): ['-2'], (22.0, 292.0, 22.0): ['1'], (29.0, 302.0, 11.0): ['2'], (19.0, 303.0, 14.0): ['2'], (22.0, 311.0, 13.0): ['2'], (28.0, 288.0, 6.0): ['2'], (30.0, 290.0, 6.0): ['-2'], (16.0, 305.0, 13.0): ['2'], (29.0, 309.0, 5.0): ['1'], (27.0, 295.0, 16.0): ['-2'], (28.0, 310.0, 13.0): ['-2'], (18.0, 294.0, 28.0): ['2'], (27.0, 301.0, 1.0): ['2'], (32.0, 306.0, 3.0): ['1'], (34.0, 290.0, -3.0): ['2'], (20.0, 305.0, 28.0): ['1'], (24.0, 302.0, 8.0): ['1'], (27.0, 308.0, 15.0): ['-2'], (21.0, 295.0, 16.0): ['1'], (23.0, 302.0, 4.0): ['2'], (20.0, 304.0, 14.0): ['-2'], (20.0, 302.0, 11.0): ['2'], (20.0, 292.0, 24.0): ['2'], (38.0, 290.0, 2.0): ['1'], (22.0, 307.0, 16.0): ['-2'], (17.0, 308.0, 17.0): ['1'], (30.0, 292.0, 14.0): ['-2'], (18.0, 302.0, 29.0): ['1'], (16.0, 311.0, 25.0): ['1'], (14.0, 309.0, 24.0): ['-2'], (13.0, 308.0, 22.0): ['1'], (34.0, 290.0, 13.0): ['1'], (19.0, 308.0, 20.0): ['-2'], (26.0, 300.0, 5.0): ['2'], (26.0, 294.0, 14.0): ['-2'], (29.0, 294.0, 3.0): ['-2'], (25.0, 297.0, 13.0): ['2'], (24.0, 308.0, 4.0): ['1'], (21.0, 311.0, 19.0): ['1'], (27.0, 304.0, 18.0): ['2'], (23.0, 292.0, 16.0): ['-2'], (20.0, 308.0, 27.0): ['-2'], (18.0, 309.0, 20.0): ['1'], (31.0, 295.0, 11.0): ['-2'], (17.0, 304.0, 28.0): ['-2'], (30.0, 288.0, 3.0): ['-2'], (23.0, 309.0, 25.0): ['1'], (14.0, 305.0, 23.0): ['1'], (30.0, 293.0, 16.0): ['-2'], (19.0, 311.0, 22.0): ['1'], (28.0, 304.0, 6.0): ['-2'], (31.0, 286.0, 1.0): ['1'], (26.0, 310.0, 17.0): ['-2'], (35.0, 294.0, 2.0): ['1'], (29.0, 293.0, 7.0): ['2'], (25.0, 307.0, 25.0): ['2'], (22.0, 294.0, 16.0): ['-2'], (13.0, 297.0, 28.0): ['2'], (22.0, 296.0, 1.0): ['-2'], (24.0, 304.0, 1.0): ['2'], (21.0, 299.0, 24.0): ['-2'], (20.0, 296.0, 0.0): ['2'], (19.0, 311.0, 11.0): ['2'], (15.0, 294.0, 23.0): ['2'], (22.0, 305.0, 11.0): ['-2'], (33.0, 286.0, 2.0): ['-2'], (29.0, 311.0, 11.0): ['-2'], (29.0, 289.0, 12.0): ['-2'], (34.0, 288.0, 2.0): ['-2'], (28.0, 308.0, 3.0): ['-2'], (18.0, 296.0, 30.0): ['2'], (27.0, 299.0, 3.0): ['2'], (33.0, 293.0, 10.0): ['-2'], (17.0, 301.0, 22.0): ['-2'], (32.0, 304.0, 13.0): ['1'], (25.0, 303.0, 6.0): ['-2'], (16.0, 297.0, 21.0): ['2'], (22.0, 290.0, 21.0): ['2'], (27.0, 306.0, 9.0): ['-2'], (21.0, 303.0, 13.0): ['1'], (36.0, 307.0, 9.0): ['2'], (20.0, 310.0, 12.0): ['1'], (38.0, 288.0, -1.0): ['2'], (34.0, 287.0, 5.0): ['-2'], (21.0, 296.0, 15.0): ['1'], (17.0, 310.0, 19.0): ['2'], (30.0, 294.0, 8.0): ['2'], (21.0, 304.0, 22.0): ['1'], (16.0, 309.0, 27.0): ['-2'], (14.0, 311.0, 26.0): ['2'], (35.0, 305.0, 12.0): ['2'], (34.0, 292.0, 15.0): ['2'], (27.0, 289.0, 19.0): ['2'], (30.0, 287.0, 0.0): ['2'], (25.0, 305.0, 14.0): ['1'], (16.0, 298.0, 25.0): ['-2'], (25.0, 299.0, 3.0): ['2'], (22.0, 302.0, 10.0): ['1'], (24.0, 306.0, 6.0): ['-2'], (21.0, 297.0, 17.0): ['1'], (21.0, 291.0, 2.0): ['2'], (20.0, 298.0, 25.0): ['-2'], (26.0, 305.0, 20.0): ['2'], (18.0, 311.0, 22.0): ['1'], (30.0, 305.0, 6.0): ['-2'], (17.0, 306.0, 30.0): ['2'], (24.0, 296.0, 21.0): ['-2'], (32.0, 287.0, 1.0): ['-2'], (14.0, 307.0, 21.0): ['1'], (28.0, 310.0, 4.0): ['2'], (31.0, 284.0, 3.0): ['2'], (26.0, 296.0, 19.0): ['1'], (26.0, 290.0, 0.0): ['2'], (13.0, 299.0, 26.0): ['1'], (24.0, 302.0, 3.0): ['2'], (27.0, 308.0, 0.0): ['2'], (21.0, 301.0, 26.0): ['2'], (23.0, 302.0, 13.0): ['2'], (20.0, 292.0, 15.0): ['2'], (30.0, 310.0, 4.0): ['2'], (19.0, 309.0, 13.0): ['-2'], (22.0, 307.0, 9.0): ['-2'], (29.0, 313.0, 9.0): ['2'], (29.0, 291.0, 10.0): ['-2'], (34.0, 290.0, 4.0): ['-2'], (27.0, 291.0, 20.0): ['2'], (18.0, 298.0, 24.0): ['-2'], (26.0, 296.0, -3.0): ['2'], (33.0, 295.0, 12.0): ['1'], (17.0, 303.0, 16.0): ['2'], (26.0, 294.0, 5.0): ['1'], (25.0, 297.0, 4.0): ['1'], (22.0, 300.0, 23.0): ['1'], (22.0, 309.0, 28.0): ['2'], (27.0, 304.0, 11.0): ['2'], (20.0, 308.0, 18.0): ['-2'], (30.0, 311.0, 14.0): ['1'], (19.0, 305.0, 26.0): ['-2'], (17.0, 304.0, 21.0): ['2'], (30.0, 288.0, 10.0): ['-2'], (21.0, 306.0, 20.0): ['-2'], (16.0, 307.0, 29.0): ['1'], (14.0, 305.0, 28.0): ['1'], (34.0, 294.0, 1.0): ['-2'], (32.0, 291.0, -2.0): ['1'], (25.0, 307.0, 16.0): ['-2'], (25.0, 293.0, 1.0): ['-2'], (24.0, 304.0, 24.0): ['2'], (21.0, 299.0, 23.0): ['-2'], (21.0, 293.0, 0.0): ['2'], (26.0, 307.0, 22.0): ['2'], (33.0, 286.0, 11.0): ['1'], (32.0, 285.0, 3.0): ['1'], (29.0, 289.0, 7.0): ['1'], (28.0, 308.0, 10.0): ['-2'], (28.0, 290.0, 15.0): ['-2'], (31.0, 296.0, 12.0): ['1'], (32.0, 290.0, -2.0): ['1'], (26.0, 298.0, 21.0): ['2'], (17.0, 301.0, 25.0): ['-2'], (26.0, 292.0, 2.0): ['-2'], (32.0, 294.0, 5.0): ['1'], (29.0, 286.0, 6.0): ['2'], (29.0, 297.0, 0.0): ['1'], (13.0, 301.0, 24.0): ['1'], (27.0, 306.0, 6.0): ['-2'], (21.0, 303.0, 20.0): ['2'], (27.0, 312.0, 17.0): ['2'], (19.0, 307.0, 15.0): ['-2'], (31.0, 309.0, 9.0): ['-2'], (20.0, 307.0, 23.0): ['-2'], (34.0, 292.0, 6.0): ['-2'], (32.0, 301.0, 4.0): ['2'], (34.0, 302.0, 11.0): ['2'], (18.0, 300.0, 26.0): ['-2'], (33.0, 289.0, 14.0): ['1'], (29.0, 296.0, 14.0): ['-2'], (24.0, 296.0, 2.0): ['-2'], (19.0, 303.0, 24.0): ['-2'], (25.0, 308.0, 21.0): ['1'], (31.0, 307.0, 13.0): ['-2'], (17.0, 306.0, 23.0): ['-2'], (23.0, 292.0, -1.0): ['1'], (15.0, 302.0, 24.0): ['-2'], (30.0, 308.0, 5.0): ['-2'], (14.0, 307.0, 30.0): ['2'], (34.0, 296.0, 3.0): ['2'], (18.0, 304.0, 15.0): ['1'], (24.0, 293.0, -2.0): ['1'], (26.0, 290.0, 15.0): ['-2'], (35.0, 292.0, 5.0): ['-2'], (34.0, 305.0, 9.0): ['-2'], (21.0, 301.0, 21.0): ['2'], (20.0, 302.0, 29.0): ['2'], (31.0, 291.0, -1.0): ['-2'], (26.0, 309.0, 16.0): ['-2'], (29.0, 291.0, 1.0): ['-2'], (28.0, 292.0, 4.0): ['-2'], (15.0, 309.0, 27.0): ['-2'], (24.0, 292.0, -1.0): ['1'], (28.0, 288.0, 9.0): ['2'], (31.0, 302.0, 10.0): ['1'], (35.0, 295.0, 1.0): ['2'], (20.0, 306.0, 27.0): ['-2'], (32.0, 292.0, 3.0): ['-2'], (16.0, 300.0, 23.0): ['-2'], (25.0, 291.0, 4.0): ['2'], (27.0, 304.0, 4.0): ['-2'], (27.0, 294.0, 15.0): ['-2'], (21.0, 297.0, 3.0): ['2'], (19.0, 305.0, 17.0): ['-2'], (30.0, 306.0, 1.0): ['1'], (37.0, 291.0, 5.0): ['1'], (21.0, 306.0, 29.0): ['2'], (22.0, 292.0, -1.0): ['2'], (29.0, 295.0, 6.0): ['2'], (34.0, 294.0, 8.0): ['1'], (25.0, 293.0, 18.0): ['-2'], (26.0, 288.0, 16.0): ['2'], (22.0, 296.0, 19.0): ['-2'], (24.0, 294.0, 0.0): ['-2'], (20.0, 296.0, 22.0): ['-2'], (20.0, 294.0, 3.0): ['2'], (19.0, 301.0, 30.0): ['2'], (25.0, 310.0, 23.0): ['2'], (29.0, 298.0, -1.0): ['2'], (31.0, 305.0, 11.0): ['-2'], (21.0, 310.0, 16.0): ['-2'], (36.0, 292.0, 10.0): ['1'], (28.0, 290.0, 6.0): ['2'], (18.0, 306.0, 9.0): ['-2'], (31.0, 296.0, 5.0): ['2'], (26.0, 292.0, 13.0): ['-2'], (30.0, 303.0, 13.0): ['2'], (16.0, 302.0, 24.0): ['-2'], (34.0, 307.0, 11.0): ['1'], (21.0, 303.0, 27.0): ['2'], (12.0, 302.0, 27.0): ['2'], (23.0, 300.0, 24.0): ['2'], (26.0, 311.0, 18.0): ['1'], (25.0, 312.0, 15.0): ['2'], (37.0, 289.0, 10.0): ['2'], (21.0, 304.0, 4.0): ['2'], (36.0, 290.0, 2.0): ['-2'], (29.0, 293.0, 3.0): ['-2'], (28.0, 312.0, 14.0): ['2'], (15.0, 299.0, 25.0): ['-2'], (28.0, 294.0, 11.0): ['1'], (17.0, 297.0, 29.0): ['1'], (32.0, 290.0, 1.0): ['-2'], (23.0, 306.0, 21.0): ['-2'], (25.0, 299.0, 17.0): ['2'], (16.0, 298.0, 21.0): ['1'], (21.0, 291.0, 16.0): ['2'], (27.0, 292.0, 13.0): ['-2'], (26.0, 305.0, 2.0): ['-2'], (37.0, 293.0, 7.0): ['2'], (24.0, 311.0, 18.0): ['1'], (34.0, 311.0, 13.0): ['2'], (21.0, 308.0, 27.0): ['1'], (28.0, 288.0, 4.0): ['2'], (23.0, 289.0, 14.0): ['2'], (29.0, 297.0, 4.0): ['2'], (34.0, 296.0, 10.0): ['2'], (17.0, 309.0, 14.0): ['1'], (30.0, 301.0, 4.0): ['1'], (25.0, 295.0, 14.0): ['-2'], (29.0, 304.0, 12.0): ['1'], (28.0, 307.0, 20.0): ['2'], (33.0, 308.0, 6.0): ['1'], (21.0, 310.0, 26.0): ['1'], (32.0, 311.0, 14.0): ['2'], (19.0, 299.0, 28.0): ['-2'], (25.0, 304.0, 17.0): ['1'], (31.0, 311.0, 9.0): ['1'], (21.0, 296.0, 14.0): ['2'], (28.0, 288.0, 0.0): ['2'], (18.0, 308.0, 11.0): ['1'], (31.0, 302.0, 3.0): ['1'], (30.0, 297.0, 11.0): ['2'], (25.0, 297.0, 22.0): ['2'], (16.0, 300.0, 30.0): ['2'], (13.0, 303.0, 29.0): ['2'], (29.0, 308.0, 19.0): ['2'], (34.0, 309.0, 13.0): ['2'], (29.0, 300.0, 6.0): ['2'], (27.0, 294.0, 4.0): ['-2'], (30.0, 311.0, 9.0): ['-2'], (26.0, 297.0, 12.0): ['2'], (21.0, 306.0, 6.0): ['1'], (36.0, 288.0, 4.0): ['1'], (23.0, 291.0, 3.0): ['2'], (29.0, 295.0, 13.0): ['-2'], (18.0, 302.0, 27.0): ['-2'], (28.0, 292.0, 5.0): ['1'], (31.0, 290.0, 6.0): ['-2'], (22.0, 309.0, 17.0): ['-2'], (32.0, 288.0, 15.0): ['2'], (35.0, 294.0, 0.0): ['1'], (23.0, 304.0, 24.0): ['2'], (22.0, 296.0, 26.0): ['1'], (24.0, 294.0, 11.0): ['2'], (21.0, 293.0, 18.0): ['-2'], (27.0, 290.0, 11.0): ['1'], (26.0, 307.0, 0.0): ['2'], (28.0, 291.0, -1.0): ['1'], (19.0, 301.0, 21.0): ['2'], (25.0, 310.0, 24.0): ['2'], (24.0, 299.0, 20.0): ['2'], (24.0, 309.0, 16.0): ['-2'], (21.0, 310.0, 25.0): ['1']}

    sparse2 = sparse1.copy()
    subCubes = tuple(np.arange(-6,7))          
    cube = np.array(list(itertools.product(subCubes, subCubes, subCubes)))
    for i in cube:
       for d in sparse1:
           coor = float(sparse1.get(d)[0])
           if coor > 0 :
               value=0#float(sparse1.get(tuple(d))[0])
               for c in cube:
                   value = value + max(0,float(sparse1.get(tuple(d+c),"0")[0]))               
               procentValue = coor/float(value)
               sparse2[d] = [str(procentValue)]   
           else:
               sparse2[d] = [str(0.0)]

【问题讨论】:

    标签: python arrays numpy dictionary


    【解决方案1】:

    虽然您的解决方案很聪明,但由于将sparse1 中的每个键都视为与其他所有键完全无关,除了通过临时查找表cube 之外,它增加了不必要的处理。如果您预处理sparse1 以计算键描述的几何值之间的Chebyshev distances,您可以使用它来查找相邻值并将它们求和。这消除了cube 数组上的循环,用更高效的索引和求和替换它。

    这是尝试使用来自 sklearn.neighbors 的 radius_neighbors_graph 复制您的代码:

    import numpy as np
    from sklearn.neighbors import radius_neighbors_graph
    
    sparse1 = ...
    
    X = np.array([list(k) for k in sparse1.keys()])
    N = radius_neighbors_graph(X, radius=6, metric='chebyshev').astype(bool)
    
    Y = np.array([max(0, float(v[0])) for v in sparse1.values()])
    sparse2 = {}
    for x, y, n in zip(X, Y, N):
        t = tuple(x)
        if sparse1[t][0][0] == '-':  # check the string value rather than converting
            sparse2[t] = sparse1[t]
        else:
            v = Y[np.squeeze(n.toarray())].sum()  # eliminates looping over cube
            v += y  # radius_neighbors_graph does not consider a point a neighbor of itself
            v += y  # potential bug in OP?  See below.
            if v <= 0:
                p = 1.
            else:
                p = y / v
            sparse2[t] = [str(p)]
    

    这里有几点需要注意:

    1. 我将元组键转换为 numpy 数组 X,这会消耗内存。
    2. 我预先执行邻居计算并存储它们,这会消耗内存(尽管N 是稀疏的,所以不会太多)。
    3. 我将 map 的值转换为浮点数,然后将它们存储在 Y 中,这也会消耗内存,但无需重复执行转换。
    4. 标记为潜在错误的行复制了您的算法的一个功能:value=float(sparse1.get(tuple(d))[0]) 复制了在循环 cube 时从 (0,0,0) 添加值,因此 OP 将此值添加了两次。

    运行一些简单的基准测试,这个版本的算法运行速度提高了大约 70 倍,无论是取舍还是取舍。我的猜测大部分来自于删除cube 上的循环。

    【讨论】:

    • 好的,这看起来很快。十分感谢!!!!!。我做了一个测试,但我认为缺少一些东西。所以我的代码生成了一个字典 sparse2,它在输出中没有负值,只有百分比值。在新方法中,输出中有负值。还有一些我不明白的事情。也许你可以解释一下 :) 所以表达式“for x,y,n in zip(X,Y,N)”是分别循环 X 中的 x、Y 中的 y 和 N 中的 n?切比雪夫距离到底是做什么的。我试图理解 wiki 文章,但还不明白。
    • 它计算到点之间的最大差异,但是会发生什么?以及挤压到底在做什么。我读到它消除了不需要的维度?,这到底是什么意思?最好的问候!
    • @Varlor,你确定地图中没有负值是真的吗?您将sparse1 复制到sparse2,然后在for 循环中使用条件if float(sparse1.get(d)[0]) &gt;= 0 : 覆盖sparse1sparse1 中的任何负值都不会被循环修改,这意味着 sparse2 仍将包含它们。
    • @Varlor,你对zip的理解是正确的。 zip 一个 python 内置函数,它一起迭代其参数中列出的所有可迭代对象,直到它到达最短可迭代对象的末尾。 docs.python.org/3/library/functions.html#zip
    • @Varlor,切比雪夫是沿任何单个维度的两点之间的最大间隔。与给定点的切比雪夫距离为 6 的所有点定义了一个边长为 12 的超立方体,该点位于该立方体的中心,这正是将cube 的每个元素添加到给定点试图模拟的内容。跨度>
    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多