Как go о решении: «операнды не могут передаваться вместе с фигурами» - PullRequest
0 голосов
/ 19 января 2020

Контекст:

Мой код (цель) объяснил:

  • Если из списка 'listCoords' значения из часового столбца находятся между 1 и 5
  • И из столбца угроз значение равно «3». -> Вывести цвет «красный».
  • ELSE, вывод 'np.append (np.insert (listCoords.index.hour, 0, 0), 23)' (который является списком массивов количества частот наблюдения в час).
  • np.append (np.insert (listCoords.index.hour, 0, 0), 23) -> затем рассматривается моим цветовым диапазоном, и каждая точка получает цвет не «красный», а скорее получает цвет, который я указал в часовом диапазоне.

Код работает, если он у меня вот так :

color=np.append(np.insert(listCoords.index.hour, 0, 0), 23)),

Я хочу указать из которые перечисляют точки, которые соответствуют моим объясненным двум условиям, и отмечают их красный .

Код также работает, если я выполняю :

color=np.where(((listCoords.index.hour >= 1) & (listCoords.index.hour < 5)) & (listCoords['Threat'] == '3'), 'red', 'blue'),

Но я не хочу, чтобы общие графики были голубыми, я хочу, чтобы они получили цвет, соответствующий часу, в который они были обнаружены.

мой фрагмент кода с отступом: :

color=np.where(((listCoords.index.hour >= 1) & (listCoords.index.hour < 5)) & (listCoords['Threat'] == '3'), 'red', np.append(np.insert(listCoords.index.hour, 0, 0), 23)),

Но выводится сообщение об ошибке: - Я не понимаю это сообщение или как его решить.

Traceback (most recent call last):
  File "/Users/Me/Desktop/DSP_Frontend/app.py", line 509, in update_graph
    color=np.where(((listCoords.index.hour >= 1) & (listCoords.index.hour < 5)) & (listCoords['Threat'] == '3'), 'red', np.append(np.insert(listCoords.index.hour, 0, 0), 23)), #
  File "<__array_function__ internals>", line 6, in where

ValueError: operands could not be broadcast together with shapes (241,) () (243,)

Мой вопрос : Как я могу решить эту проблему?

мой общий контекст кода :

return go.Figure(
        data=[
            # Data for all observations based on date and time
            Scattermapbox(
                lat=listCoords["Lat"],
                lon=listCoords["Lon"],
                mode="markers",
                hoverinfo="text + lat + lon",
                text=np.append(np.insert(listCoords.index.hour, 0, 0), 23), #listCoords.index.hour,
                marker=dict(
                    showscale=True,
                    # the color is decided by the time of detection.
                    # color=np.append(np.insert(listCoords.index.hour, 0, 0), 23),
                    color=np.where(((listCoords.index.hour >= 1) & (listCoords.index.hour < 5)) & (listCoords['Threat'] == '3'), 'red', 'blue'), #
                    opacity=np.where(((listCoords.index.hour >= 1) & (listCoords.index.hour < 5)) & (listCoords['Threat'] == '3'), 0.1, 0.6), 
                    size=np.where(((listCoords.index.hour >= 1) & (listCoords.index.hour < 5)) & (listCoords['Threat'] == '3'), 80, 7),
                    colorscale=[
                        [0, "#F4EC15"],
                        [0.04167, "#DAF017"],
                        [0.0833, "#BBEC19"],
                        [0.125, "#9DE81B"],
                        [0.1667, "#80E41D"],
                        [0.2083, "#66E01F"],
                        [0.25, "#4CDC20"],
                        [0.292, "#34D822"],
                        [0.333, "#24D249"],
                        [0.375, "#25D042"],
                        [0.4167, "#26CC58"],
                        [0.4583, "#28C86D"],
                        [0.50, "#29C481"],
                        [0.54167, "#2AC093"],
                        [0.5833, "#2BBCA4"],
                        [1.0, "#613099"],
                    ],
                    colorbar=dict(
                        title="Time of<br>Day",
                        x=0.93,
                        xpad=0,
                        nticks=24,
                        tickfont=dict(color="#d8d8d8"),
                        titlefont=dict(color="#d8d8d8"),
                        thicknessmode="pixels",
                    ),
                ),
            ),

------------------- --EDIT 1 ---------------------

Я добавил следующую строку в мой код для проверки форм:

    shape1 = (listCoords.index.hour >= 1) & (listCoords.index.hour < 5)
    shape2 = (listCoords['Threat'] == '3')
    shape3 =  np.append(np.insert(listCoords.index.hour, 0, 0), 23)

    print('shape 1: ', shape1, ' shape 2: ', shape2, ' shape 3: ', shape3)

Это приводит к следующему:

shape 1:  [ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False]  

shape 2:  Date/Time
2019-06-02 04:00:00    False
2019-06-02 04:05:00    False
2019-06-02 04:10:00    False
2019-06-02 04:15:00    False
2019-06-02 04:20:00    False
                       ...  
2019-06-02 16:25:00    False
2019-06-02 16:30:00    False
2019-06-02 16:35:00    False
2019-06-02 16:40:00    False
2019-06-02 16:45:00    False

Name: Threat, Length: 241, dtype: bool  
shape 3:  [ 0  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  5  5  5  5  5  5
      5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  6  6  6  6  6  6
      6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  7  7  7  7  7  7
      7  7  7  7  7  7  7  7  7  7  8  8  8  8  8  8  8  8  8  8  8  8  8  8
      8  8  8  8  8  8  8  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9
      9  9  9  9  9 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12
     12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
     13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
     14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15
     15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16
     16 16 23]

Таким образом, очевидно, существует существенная разница между формами (241,) и (243,)

Ответы [ 2 ]

1 голос
/ 19 января 2020

Давайте сосредоточимся на вашей where проблеме, с более простым случаем:

массив 1d и условие:

In [37]: x = np.arange(10)                                                                       
In [38]: cond = (x>3)&(x<8)                                                                      
In [39]: y = np.append(np.insert(x,0,-1),100)                                                    
In [40]: cond.shape                                                                              
Out[40]: (10,)
In [41]: y.shape                                                                                 
Out[41]: (12,)
In [42]: y                                                                                       
Out[42]: array([ -1,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9, 100])

Мы получаем вашу ошибку, когда пытаемся использовать cond размера 10 со значением y размера 12.

In [43]: np.where(cond, -1, y)                                                                   
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-43-13267573c792> in <module>
----> 1 np.where(cond, -1, y)

<__array_function__ internals> in where(*args, **kwargs)

ValueError: operands could not be broadcast together with shapes (10,) () (12,) 

Мы можем расширить cond до размера 12:

In [44]: cond1 = np.append(np.insert(cond,0,False),False)                                        
In [45]: cond1                                                                                   
Out[45]: 
array([False, False, False, False, False,  True,  True,  True,  True,
       False, False, False])
In [46]: np.where(cond1, -1, y)                                                                  
Out[46]: array([ -1,   0,   1,   2,   3,  -1,  -1,  -1,  -1,   8,   9, 100])
In [47]: _.shape                                                                                 
Out[47]: (12,)

Обратите внимание, что результат имеет размер 12

Ваш оригинал, где работает, потому что он использует cond размера 10 с двумя скалярными значениями:

In [48]: np.where(cond, -1, 100)                                                                 
Out[48]: array([100, 100, 100, 100,  -1,  -1,  -1,  -1, 100, 100])
In [49]:                                                                  
0 голосов
/ 21 января 2020

РЕШЕНИЕ:

Сначала я удалил добавление / вставку, потому что 0 и 23 не были нужны. Это решило проблему «нельзя было передавать операнды вместе с фигурами». Это вернуло вторую форму из (243,) в (241,).

Но теперь со следующим примененным фрагментом:

color=np.where((listCoords['Threat'] == '3'), 'red', listCoords.index.hour)

Она выдала новую ошибку:

ValueError: 
    Invalid element(s) received for the 'color' property of scattermapbox.marker
        Invalid elements include: ['4', '4', '4', '4', '4', '4', '4', '4', '4', '4']

    The 'color' property is a color and may be specified as:
      - A hex string (e.g. '#ff0000')
      - An rgb/rgba string (e.g. 'rgb(255,0,0)')
      - An hsl/hsla string (e.g. 'hsl(0,100%,50%)')
      - An hsv/hsva string (e.g. 'hsv(0,100%,100%)')
      - A named CSS color:
            aliceblue, antiquewhite, aqua, aquamarine, azure,
            beige, bisque, black, blanchedalmond, blue,
            blueviolet, brown, burlywood, cadetblue,
            chartreuse, chocolate, coral, cornflowerblue....

Чтобы решить эту проблему, я изменил цветовую шкалу, сказав [0, "# FF0000"] (значение 0 равно красному).

Впоследствии я сказал, что если ('Threat == 3' даст 0) иначе дать обычные цвета.

Мой новый код (только части, которые были обновлены):

    red = 0
    mycolors = np.where((listCoords['Threat'] == '3'), red, listCoords.index.hour)
    print(mycolors)

и

  color=np.array(mycolors, int),
                colorscale=[
                    [0, "#FF0000"],
                    [0.04167, "#DAF017"],
                    [0.0833, "#BBEC19"],
                    [0.125, "#9DE81B"],
                    [0.1667, "#80E41D"],
                    [0.2083, "#66E01F"],
                    [0.25, "#4CDC20"],
                    [0.292, "#34D822"],
                    [0.333, "#24D249"],
                    [0.375, "#25D042"],
                    [0.4167, "#26CC58"],
                    [0.4583, "#28C86D"],
                    [0.50, "#29C481"],
                    [0.54167, "#2AC093"],
                    [0.5833, "#2BBCA4"],
                    [1.0, "#613099"],
                ],
...