Khai báo mảng rỗng trong python

Để thêm vào câu trả lời của Lennart, một mảng có thể được tạo như thế này:

from

array

import

array float_array

=

array

(

"f"

,

values

)

trong đó các giá trị có thể ở dạng một tuple, list hoặc np.array, nhưng không phải là mảng:

values

=

[

1

,

2

,

3

]

values

=

(

1

,

2

,

3

)

values

=

np

.

array

([

1

,

2

,

3

],

'f'

)

# 'i' will work here too, but if array is 'i' then values have to be int

wrong_values

=

array

(

'f'

,[

1

,

2

,

3

])

# TypeError: 'array.array' object is not callable

và đầu ra vẫn sẽ giống nhau:

print

(

float_array

)

print

(

float_array

[

1

])

print

(

isinstance

(

float_array

[

1

],

float

))

# array('f', [1.0, 2.0, 3.0])

# 2.0

# True

Hầu hết các phương thức cho danh sách cũng hoạt động với mảng, các phương thức phổ biến là
pop (), extend () và append ().

Đánh giá từ các câu trả lời và nhận xét, có vẻ như cấu trúc dữ liệu mảng không phổ biến. Mặc dù vậy, tôi thích nó, giống như cách người ta có thể thích một tuple trong danh sách.

Cấu trúc mảng có các quy tắc chặt chẽ hơn so với danh sách hoặc np.array và điều này có thể giảm lỗi và giúp gỡ lỗi dễ dàng hơn, đặc biệt là khi làm việc với dữ liệu số.

Nỗ lực
chèn / nối một float vào một mảng int sẽ ném TypeError:

values

=

[

1

,

2

,

3

]

int_array

=

array

(

"i"

,

values

)

int_array

.

append

(

float

(

1

))

# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

Do đó, việc giữ các giá trị có nghĩa là số nguyên (ví dụ: danh sách các chỉ mục) ở dạng mảng có thể ngăn “Chỉ số danh sách TypeError: phải là số nguyên, không nổi”, vì các mảng có thể được lặp lại, tương tự như np.array và danh sách:

int_array

=

array

(

'i'

,[

1

,

2

,

3

])

data

=

[

11

,

22

,

33

,

44

,

55

]

sample

=

[]

for

i

in

int_array

:

sample

.

append

(

data

[

i

])

Khó chịu, việc thêm một int vào một mảng float sẽ khiến int trở thành một float, mà không đưa ra một ngoại lệ.

np.array
cũng giữ nguyên kiểu dữ liệu cho các mục nhập của nó, nhưng thay vì đưa ra lỗi, nó sẽ thay đổi kiểu dữ liệu để phù hợp với các mục mới (thường là gấp đôi hoặc str):

import

numpy

as

np numpy_int_array

=

np

.

array

([

1

,

2

,

3

],

'i'

)

for

i

in

numpy_int_array

:

print

(

type

(

i

))

# <class 'numpy.int32'>

numpy_int_array_2

=

np

.

append

(

numpy_int_array

,

int

(

1

))

# still <class 'numpy.int32'>

numpy_float_array

=

np

.

append

(

numpy_int_array

,

float

(

1

))

# <class 'numpy.float64'> for all values

numpy_str_array

=

np

.

append

(

numpy_int_array

,

"1"

)

# <class 'numpy.str_'> for all values

data

=

[

11

,

22

,

33

,

44

,

55

]

sample

=

[]

for

i

in

numpy_int_array_2

:

sample

.

append

(

data

[

i

])

# no problem here, but TypeError for the other two

Điều này đúng trong quá trình chuyển nhượng là tốt. Nếu loại dữ liệu được chỉ định, np.array sẽ, bất cứ khi nào có thể, sẽ chuyển đổi các mục nhập thành loại dữ liệu đó:

int_numpy_array

=

np

.

array

([

1

,

2

,

float

(

3

)],

'i'

)

# 3 becomes an int

int_numpy_array_2

=

np

.

array

([

1

,

2

,

3.9

],

'i'

)

# 3.9 gets truncated to 3 (same as int(3.9))

invalid_array

=

np

.

array

([

1

,

2

,

"string"

],

'i'

)

# ValueError: invalid literal for int() with base 10: 'string'

# Same error as int('string')

str_numpy_array

=

np

.

array

([

1

,

2

,

3

],

'str'

)

print

(

str_numpy_array

)

print

([

type

(

i

)

for

i

in

str_numpy_array

])

# ['1' '2' '3']

# <class 'numpy.str_'>

hoặc, về bản chất:

data

=

[

1.2

,

3.4

,

5.6

]

list_1

=

np

.

array

(

data

,

'i'

).

tolist

()

list_2

=

[

int

(

i

)

for

i

in

data

]

print

(

list_1

==

list_2

)

# True

trong khi mảng
đơn giản sẽ cung cấp:

invalid_array

=

array

([

1

,

2

,

3.9

],

'i'

)

# TypeError: integer argument expected, got float

Bởi vì điều này, không nên sử dụng np.array cho các lệnh dành riêng cho loại. Cấu trúc mảng rất hữu ích ở đây. danh sách bảo tồn kiểu dữ liệu của các giá trị.

Và đối với một cái gì đó tôi thấy khá phiền phức: kiểu dữ liệu được chỉ định làm đối số đầu tiên trong mảng (), nhưng (thường) là thứ hai trong np.array (). : |

Mối quan hệ với
C được đề cập ở đây: Danh sách Python so với Mảng – khi nào nên sử dụng?

Hãy vui vẻ khám phá!

Lưu ý: Bản chất được gõ và khá nghiêm ngặt của mảng dựa nhiều vào C hơn là Python và theo thiết kế Python không có nhiều ràng buộc về kiểu cụ thể trong các hàm của nó. Sự
phổ biến của nó cũng tạo ra một phản hồi tích cực trong công việc cộng tác và thay thế nó chủ yếu liên quan đến một [int (x) bổ sung cho x trong tệp]. Do đó, hoàn toàn khả thi và hợp lý để bỏ qua sự tồn tại của mảng. Nó không nên cản trở hầu hết chúng ta bằng mọi cách. : D

10 hữu ích 0 bình luận chia sẻ