to_typed_array_spec encodes bdata in host byte order; plotly.js always decodes it as little-endian
Maintainer antworten meist innerhalb von 3 Tagen
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 79/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- numpy, python
- Bereich
- backend, data-visualization
Rechercherichtung
Beginne in _plotly_utils/utils.py bei to_typed_array_spec (etwa bei Zeile 84) und verfolge, wie der dtype des Arrays ausgewählt und seine Bytes kodiert werden. Prüfe das Verhalten bei Arrays mit Little- und Big-Endian, einschließlich der bereitgestellten Reproduktion. Erledigt ist die Aufgabe, wenn die kodierten Daten als Little-Endian zu den ursprünglichen numerischen Werten dekodiert werden und ein Regressionstest den gemeldeten Fall abdeckt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Summary
to_typed_array_spec (_plotly_utils/utils.py:84) does:
arrObj = {
"dtype": plotlyjsShortTypes[dtype],
"bdata": base64.b64encode(v).decode("ascii"),
}
with no explicit byte-order normalization before encoding, so bdata follows whatever byte order the array's dtype naturally has, which for an array built without an explicit </> prefix is the host's native order.
plotly.js decodes bdata with new Float64Array(buffer), which always reads in the platform's native order, little-endian in every real browser. On a big-endian host, this means bdata ships bytes that no browser can read correctly.
Repro (confirmed on real big-endian hardware: z/OS/s390x, numpy 2.5.3)
Through the actual function, not just a standalone simulation:
import numpy as np
from _plotly_utils.utils import to_typed_array_spec
v = np.array([1.1, 2.3, 3.5])
spec = to_typed_array_spec(v)
print(spec)
import base64
raw = base64.b64decode(spec["bdata"])
as_little = np.frombuffer(raw, dtype="<f8") # what plotly.js's Float64Array reads
print("decoded as browser Float64Array would read it:", as_little)
print("matches original:", np.array_equal(v, as_little))
Output:
{'dtype': 'f8', 'bdata': 'P/GZmZmZmZpAAmZmZmZmZkAMAAAAAAAA'}
decoded as browser Float64Array would read it: [-1.54234871e-180 1.90359857e+185 1.54938987e-320]
matches original: False
So any big-endian host produces charts with silently corrupted numeric data.
Suggested fix
Normalize v to little-endian before encoding, e.g. v = v.astype(v.dtype.newbyteorder("<")) immediately before the base64.b64encode(v) call. Verified this resolves it on the same hardware:
v_fixed = v.astype(v.dtype.newbyteorder("<"))
bdata_fixed = base64.b64encode(v_fixed).decode("ascii")
raw_fixed = base64.b64decode(bdata_fixed)
as_little_fixed = np.frombuffer(raw_fixed, dtype="<f8")
print(np.array_equal(v, as_little_fixed)) # True
Originally spotted by @chrikrah in #5833;
- Vorherrschende Sprache
- Python
- Sterne
- 18.9k
- Forks
- 2.9k
- Ø Merge
- 5 T. 1 Std.
- Gemergte PRs (30 T.)
- 14
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus plotly/plotly.py
-
[BUG]: NaT inside a datetime64 array serializes as the string "NaT" instead of nullEvtl. vergeben @senanurcetin hat das vor 2 Tagen übernommen. Offenbug P3 size: 1
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
plotly/plotly.py#5829 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 3 Tagen
-
[BUG]: Integer and string properties reject NumPy scalarsEvtl. vergeben @RaphaelFakhri hat das vor 4 Tagen übernommen. Offenbug P3 size: 1
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
plotly/plotly.py#5827 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 3 Tagen
-
[BUG]: Single-color requests raise ZeroDivisionError in palette helpersEvtl. vergeben @MokiMeow hat das vor 13 Tagen übernommen. Offenbug P3 size: 1
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
plotly/plotly.py#5805 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 3 Tagen
-
[BUG]: Unnecessary `UserWarning` when using `fig.write_image()` with `kaleido.start_sync_server()`Evtl. vergeben @jayzhou2309 hat das vor 21 Tagen übernommen. Offenbug P3 size: 1
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
plotly/plotly.py#5786 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 3 Tagen
-
P3 size: 1 task
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
plotly/plotly.py#5769 · 1 Reaktion ·
Maintainer antworten meist innerhalb von 3 Tagen
Alle Issues in plotly/plotly.py
Ähnliche Issues
-
Python Volcengine provider returns failures instead of raising themEvtl. vergeben @Ricardo-M-L hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 79/100
agent-infra/sandbox#248 ·
-
Textractor leaves empty temporary files when remote retrieval failsEvtl. vergeben @HuaTNA hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 1 Tag
-
test(bm_generation): pin the learning parameters and CPU sync shortcutEvtl. vergeben @iloveeyjafjalla hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
qboson/kaiwu-pytorch-plugin#1341 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
elder-plinius/V3R1T4S#625 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
foxglove/mcap#1907 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag