Các đối tượng Python dựng sẵn như dicts và list có thể được chuyển đổi thành Mảng khó xử và tất cả các Mảng khó xử có thể được chuyển đổi thành đối tượng Python. Thông tin về loại khó hiểu, chẳng hạn như sự khác biệt giữa danh sách có kích thước cố định và danh sách có độ dài thay đổi, bị mất khi chuyển đổi thành các đối tượng Python
import awkward as ak import numpy as np import pandas as pd
Từ Python đến vụng về
Chức năng cho Python → Chuyển đổi khó xử là
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]
ak_array = ak.from_iter[py_objects] ak_array
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float64
Xem các phần bên dưới để biết cách các loại Python được ánh xạ tới các loại Awkward
Lưu ý rằng đây nên được coi là một chức năng chậm, sử dụng nhiều bộ nhớ. nó không chỉ cần lặp lại dữ liệu Python mà còn cần khám phá dần dần loại dữ liệu. Bên trong, chức năng này sử dụng một để tích lũy dữ liệu và khám phá các loại đồng thời. Chẳng hạn, đừng chuyển đổi một tập dữ liệu lớn, số từ NumPy hoặc Arrow thành các đối tượng Python chỉ để sử dụng. Có chức năng chuyên biệt cho điều đó. xem hướng dẫn của họ [thanh bên trái hoặc nút ≡ trên thiết bị di động]
Đây cũng là hoạt động dự phòng của và các nhà xây dựng. Thông thường, các ví dụ nhỏ được xây dựng bằng cách chuyển trực tiếp các đối tượng Python tới các hàm tạo này
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float64
ak.Record[{"x": 1, "y": [1.1, 2.2]}]
________số 8_______
Từ vụng về đến Python
Chức năng chuyển đổi Lúng túng → Python là
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float64
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects1
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects3
________số 8_______
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects5
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects6
Lưu ý rằng đây nên được coi là một chức năng chậm, sử dụng nhiều bộ nhớ, như. Chẳng hạn, đừng chuyển đổi một tập dữ liệu số lớn chỉ để chuyển đổi các danh sách đó thành NumPy hoặc Arrow. Có chức năng chuyên biệt cho điều đó. xem hướng dẫn của họ [thanh bên trái hoặc nút ≡ trên thiết bị di động]
Mảng và Bản ghi vụng về có phương thức
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects72. Đối với các tập dữ liệu nhỏ [hoặc một phần nhỏ của tập dữ liệu], đây là một cách thuận tiện để xem nhanh
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects7
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects8
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects9
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]0
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]1
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]2
Hàm tạo kiểu gấu trúc
Như chúng ta đã thấy, hàm tạo ] diễn giải một đối số có thể lặp lại là dữ liệu mà nó được dùng để biểu diễn, như trong
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]3
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]5
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float64
Nhưng đôi khi, bạn có một số lần lặp mà bạn muốn sử dụng làm cột của bảng. Hàm tạo Pandas DataFrame diễn giải một lệnh của các lần lặp dưới dạng các cột
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]7
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]8
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]9
xy0[1. 1, 2. 2, 3. 3]một1[]hai2[4. 4, 5. 5] ba
Và nhà xây dựng cũng vậy
ak_array = ak.from_iter[py_objects] ak_array0
ak_array = ak.from_iter[py_objects] ak_array1
ak_array = ak.from_iter[py_objects] ak_array2
ak_array = ak.from_iter[py_objects] ak_array3
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects1
ak_array = ak.from_iter[py_objects] ak_array5
Lưu ý rằng đây là chuyển vị của cách diễn giải dữ liệu nếu nó nằm trong một danh sách, chứ không phải là một lệnh chính tả. Các giá trị
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects75 và
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects76 được hiểu là xen kẽ trong mỗi bản ghi. Không có khả năng xảy ra xung đột giữa các hàm tạo kiểu -style và kiểu Pandas vì được áp dụng cho một dict sẽ luôn trả về một , thay vì một
ak_array = ak.from_iter[py_objects] ak_array6
ak_array = ak.from_iter[py_objects] ak_array7
ak_array = ak.from_iter[py_objects] ak_array8
ak_array = ak.from_iter[py_objects] ak_array9
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects5
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float641
Hàm áp dụng cho một dict cũng tương đương với hàm tạo
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float642
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float643
Chuyển đổi số và booleans
Python
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects83,
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects84 và
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects85 [được gọi là các kiểu “nguyên thủy”] được chuyển đổi thành các kiểu
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects86,
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects87 và
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects85 trong Mảng khó xử
Tất cả các loại Lúng túng của dấu phẩy động được chuyển đổi thành
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects83 của Python, tất cả các loại Lúng túng tích phân được chuyển đổi thành
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects84 của Python và loại boolean của Lúng túng được chuyển đổi thành
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects85 của Python
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float644
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float645
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float646
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float647
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float648
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float649
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]0
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]1
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]2
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]3
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]4
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]5
Chuyển đổi danh sách
Danh sách Python, cũng như các lần lặp khác ngoài dict, tuple, str và byte, được chuyển đổi thành danh sách có độ dài thay đổi của Awkward. Không thể xây dựng danh sách có kích thước cố định với. [Một cách để làm điều đó là chuyển đổi một mảng NumPy với. ]
Các danh sách có kích thước cố định và độ dài thay đổi của vụng về được chuyển đổi thành danh sách Python với
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float64
ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]]8
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float640
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float641
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float642
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float643
Ghi chú
chủ đề nâng cao. phần còn lại của phần này có thể được bỏ qua nếu bạn không quan tâm đến sự khác biệt giữa danh sách có kích thước cố định và danh sách có độ dài thay đổi
Lưu ý rằng một mảng NumPy là một mảng có thể lặp lại, vì vậy hãy lặp lại nó, xây dựng các danh sách Lúng túng có độ dài thay đổi. Ngược lại, chuyển dữ liệu [không lặp lại] vào các danh sách khó xử có kích thước cố định
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float644
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float645
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float646
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float647
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float648
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float649
Lưu ý rằng các loại khác nhau.
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects97 đấu với
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects98. Hàm tạo sử dụng nếu được cung cấp một mảng NumPy [với
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]01] và nếu được cung cấp một lần lặp mà nó không nhận ra
Điều này có thể đặc biệt tinh tế khi các mảng NumPy được lồng trong các lần lặp
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float644
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float645
ak.Record[{"x": 1, "y": [1.1, 2.2]}]2
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float649
ak.Record[{"x": 1, "y": [1.1, 2.2]}]4
ak.Record[{"x": 1, "y": [1.1, 2.2]}]5
ak.Record[{"x": 1, "y": [1.1, 2.2]}]6
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float647
ak.Record[{"x": 1, "y": [1.1, 2.2]}]8
ak.Record[{"x": 1, "y": [1.1, 2.2]}]9
{x: 1, y: [1.1, 2.2]} ------------------ type: { x: int64, y: 2 * float64 }0
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float647
Logic đằng sau chính sách này là chỉ các mảng NumPy có
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]01 mới được đảm bảo có nội dung có kích thước cố định. Các trường hợp khác phải có
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]04 danh sách loại
{x: 1, y: [1.1, 2.2]} ------------------ type: { x: int64, y: 2 * float64 }2
{x: 1, y: [1.1, 2.2]} ------------------ type: { x: int64, y: 2 * float64 }3
{x: 1, y: [1.1, 2.2]} ------------------ type: { x: int64, y: 2 * float64 }4
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float64
{x: 1, y: [1.1, 2.2]} ------------------ type: { x: int64, y: 2 * float64 }6
{x: 1, y: [1.1, 2.2]} ------------------ type: { x: int64, y: 2 * float64 }7
{x: 1, y: [1.1, 2.2]} ------------------ type: { x: int64, y: 2 * float64 }8
[[1.1, 2.2, 3.3], [], [4.4, 5.5]] ----------------------- type: 3 * var * float64
Chuyển đổi chuỗi và bytestrings
Các chuỗi Python [loại
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]05] được chuyển đổi thành và từ các chuỗi được mã hóa UTF-8 của Awkward và các chuỗi phụ Python [loại
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]06] được chuyển đổi thành và từ các chuỗi phụ không được mã hóa của Awkward
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array0
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array1
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array2
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array3
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array4
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array5
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array6
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array7
Ghi chú
chủ đề nâng cao. phần còn lại của phần này có thể được bỏ qua nếu bạn không quan tâm đến các biểu diễn bên trong
Các chuỗi và byte của vụng về không phải là các loại riêng biệt, mà là các chuyên biệt hóa của các danh sách có độ dài thay đổi. Trong khi một danh sách có thể được biểu diễn bên trong bởi a hoặc a ,
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array8
ak_array = ak.Array[[[1.1, 2.2, 3.3], [], [4.4, 5.5]]] ak_array9
Các chuỗi và chuỗi phụ chỉ là s và s của các số nguyên một byte với các tham số đặc biệt
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects00
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects01
Các tham số này chỉ ra rằng các mảng chuỗi phải có các hành vi đặc biệt, chẳng hạn như đẳng thức trên mỗi chuỗi, thay vì đẳng thức trên mỗi ký tự
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects02
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects03
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects04
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects05
[Nếu không có hành vi quá tải này, việc so sánh chuỗi sẽ mang lại kết quả là
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]11 cho
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]12 và sẽ không phát sóng được
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]13 và
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]14. ]
Các hành vi đặc biệt cho chuỗi được triển khai bằng cùng một cơ chế mà bạn có thể sử dụng để cung cấp các hành vi đặc biệt cho Mảng và Bản ghi
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects06
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects07
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects08
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects09
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects10
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects11
Cần lưu ý rằng các chuỗi thực sự chỉ là các danh sách có độ dài thay đổi, vì chúng có thể hoạt động theo những cách giống như danh sách một cách bất ngờ. Nếu bạn nhận thấy bất kỳ hành vi nào có thể bị quá tải đối với chuỗi, hãy đề xuất hành vi đó dưới dạng yêu cầu tính năng
Chuyển đổi các ký tự và bộ dữ liệu
Các lệnh của Python với các khóa có giá trị chuỗi được chuyển đổi thành và từ loại bản ghi của Awkward với các trường được đặt tên. Dữ liệu được liên kết với các trường khác nhau có thể có các loại khác nhau, nhưng bạn thường muốn dữ liệu được liên kết với tất cả các phiên bản của cùng một trường có cùng loại. Các ký tự Python với các khóa có giá trị không phải chuỗi không có giá trị tương đương trong Mảng vụng về [các bản ghi rất khác so với ánh xạ]
Các bộ dữ liệu Python được chuyển đổi sang và từ loại bản ghi của Awkward với các trường không tên. Lưu ý rằng Awkward xem các danh sách và bộ dữ liệu của Python theo những cách rất khác nhau. các danh sách dự kiến có độ dài thay đổi với tất cả các phần tử có cùng loại, trong khi các bộ dự kiến có kích thước cố định với các phần tử có các loại tiềm năng khác nhau, giống như một bản ghi
Trong ví dụ sau, trường
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects75 có loại
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects87 và trường
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects76 có loại
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects97
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects12
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects13
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects14
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects15
Đây là ví dụ tương ứng với bộ dữ liệu
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects16
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects17
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects18
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects19
Cả hai loại Awkward này,
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]20 và
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]21, đều có hai trường, nhưng loại đầu tiên có tên cho các trường đó
Cả hai đều có thể được trích xuất bằng cách sử dụng các chuỗi nằm giữa các dấu ngoặc vuông, mặc dù các chuỗi phải là
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]22 và
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]23 đối với bộ dữ liệu
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects20
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects21
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects22
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects23
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects24
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects21
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects26
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects23
Lưu ý sự khác biệt về ý nghĩa giữa
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]23 và
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]25 trong ví dụ trên. Để an toàn, bạn có thể muốn sử dụng
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects28
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects21
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects30
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects21
Bằng cách đó, bạn có thể đặt tên cho các biến bất cứ thứ gì bạn thích
Nếu các trường bị thiếu trong một số bản ghi, các giá trị bị thiếu sẽ được điền bằng Không có [loại tùy chọn. thêm về điều đó bên dưới]
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects32
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects33
Nếu một số bộ dữ liệu có độ dài khác nhau, Mảng khó xử kết quả được coi là không đồng nhất [kiểu hợp nhất. thêm về điều đó bên dưới]
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects34
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects35
Bản ghi vụng về là một đại lượng vô hướng được rút ra từ một mảng bản ghi, do đó, một bản ghi có thể được tạo từ một lệnh duy nhất với các khóa có giá trị chuỗi
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects36
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects37
Điều này cũng không đúng với các bộ dữ liệu. Hàm tạo mong đợi các trường được đặt tên
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects38
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects39
Giá trị bị mất. Python Không có
Python's Không có thể xuất hiện ở bất cứ đâu trong cấu trúc được phân tích cú pháp bởi. Nó làm cho tất cả dữ liệu ở cấp độ lồng nhau đó có loại tùy chọn và được biểu thị dưới dạng Không có
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects40
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects41
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects42
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects43
Ghi chú
chủ đề nâng cao. phần còn lại của phần này mô tả sự tương đương giữa trường bản ghi bị thiếu và trường bản ghi không có giá trị, chỉ liên quan đến bộ dữ liệu có trường bị thiếu
Như đã mô tả ở trên, các trường không có trong một số bản ghi nhưng không có trong các bản ghi khác được điền bằng Không có. Do đó, các chuyển đổi từ Python sang Mảng lúng túng trở lại Python không nhất thiết dẫn đến biểu thức ban đầu
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects44
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects45
Đây là một sự lựa chọn có chủ ý. Có thể chuyển đổi các bản ghi có các trường bị thiếu thành các mảng có kiểu kết hợp [thêm về điều đó bên dưới], điều này sẽ dẫn đến biểu thức ban đầu,
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects46
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects47
Nhưng các tập dữ liệu điển hình của bản ghi với các tập hợp trường khác nhau biểu thị các trường bị thiếu, thay vì các loại đối tượng hoàn toàn khác nhau. [Ngay cả trong các ứng dụng vật lý hạt kết hợp “các đối tượng electron” với “các đối tượng photon”, cả hai loại đối tượng đều có các trường quỹ đạo giống nhau
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects75,
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects76,
[[1.1, 2.2, 3.3], [], [4.4, 5.5]]34 và khác nhau ở các trường tồn tại cho cái này chứ không phải cho cái kia, chẳng hạn như _______2_______35 cho các electron . ]
Việc sử dụng bộ nhớ của các mảng kết hợp thay đổi theo số lượng các loại khác nhau, lên tới $2^n$ đối với các bản ghi có các trường $n$ có khả năng bị thiếu. Các loại tùy chọn của các bản ghi hoàn toàn rời rạc với các trường $n_1$ và $n_2$ sử dụng dung lượng bộ nhớ có tỷ lệ là $n_1 + n_2$. Giả sử rằng các bản ghi rời rạc là một loại bản ghi duy nhất có các trường bị thiếu là một lỗi có thể phục hồi được, nhưng giả sử rằng một loại bản ghi có các trường bị thiếu là khác biệt đối với mọi tổ hợp các trường bị thiếu có thể là một thảm họa
Mặt khác, các bộ có độ dài khác nhau được coi là các loại khác nhau vì nhầm vị trí $i$ với vị trí $i + 1$ dù sao cũng sẽ tạo ra các liên kết
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects48
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects49
các loại công đoàn. dữ liệu không đồng nhất
Nếu dữ liệu trong một Python iterable có các kiểu khác nhau ở cùng một cấp độ lồng [“không đồng nhất”], thì các Mảng khó xử được tạo bởi có các kiểu kết hợp
Hầu hết các thao tác khó xử được xác định trên các Mảng được gõ liên kết, nhưng nhìn chung chúng không hiệu quả bằng các thao tác tương tự trên các Mảng được nhập đơn giản
Ví dụ sau trộn số [
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects86] với danh sách [
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects97]
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects50
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects51
Hàm chuyển đổi nó trở lại thành một danh sách Python không đồng nhất
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects52
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects53
Bất kỳ loại có thể được trộn lẫn. số và danh sách, danh sách và bản ghi, dữ liệu bị thiếu, v.v.
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects54
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects55
Một ngoại lệ là dữ liệu số được hợp nhất mà không tạo kiểu kết hợp. số nguyên được mở rộng thành số dấu phẩy động
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects56
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects57
Nhưng booleans không được hợp nhất với số nguyên
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects58
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects59
Như đã mô tả ở trên, các bản ghi có các nhóm trường khác nhau được coi là một loại bản ghi duy nhất với các giá trị bị thiếu
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects60
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects61
Nhưng các bộ dữ liệu có độ dài khác nhau được coi là các loại khác nhau
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects62
py_objects = [[1.1, 2.2, 3.3], [], [4.4, 5.5]] py_objects63
Kiểm soát nhiều hơn đối với chuyển đổi
Các chuyển đổi được mô tả ở trên được áp dụng khi nó ánh xạ dữ liệu vào một. Để kiểm soát nhiều hơn quá trình chuyển đổi [e. g. để kết hợp các bản ghi], sử dụng trực tiếp