Thêm phần tử đơn lẻ vào mảng trong numpy


122

Tôi có một mảng numpy chứa:

[1, 2, 3]

Tôi muốn tạo một mảng chứa:

[1, 2, 3, 1]

Đó là, tôi muốn thêm phần tử đầu tiên vào cuối mảng.

Tôi đã thử điều hiển nhiên:

np.concatenate((a, a[0]))

Nhưng tôi gặp lỗi khi nói ValueError: arrays must have same number of dimensions

Tôi không hiểu điều này - các mảng đều chỉ là mảng 1d.


1
np.insert([1,2,3], 3, 1)
Sparkler

Câu trả lời:


163

append() tạo một mảng mới có thể là mảng cũ với phần tử được nối thêm.

Tôi nghĩ việc sử dụng phương pháp thích hợp để thêm một phần tử là bình thường hơn:

a = numpy.append(a, a[0])

29
Lệnh này không làm thay đổi amảng. Tuy nhiên, nó trả về một mảng mới được sửa đổi. Vì vậy, nếu cần a sửa đổi thì a = numpy.append(a,a[0])phải được sử dụng.
Amjad

np.appendsử dụng np.concatenate. Nó chỉ đảm bảo rằng addon có một thứ nguyên. Lỗi OP là a[0]có 0 thứ nguyên.
hpaulj

Tại sao append lại tạo ra một mảng hoàn toàn mới nếu tôi chỉ muốn thêm một phần tử?
ed22

Tôi không thích việc chúng ta cần gọi một hàm khác cho một lệnh đơn giản như vậy. Sẽ đẹp hơn nếu có một phương thức bên trong chính mảng giống như a.append(1), a.add(1)hoặc thậm chí một cái gì đó tương tự với các danh sách nhưa + [1]
Fernando Wittmann

17

Khi chỉ thêm một lần hoặc một lần thỉnh thoảng, sử dụng np.appendtrên mảng của bạn sẽ ổn. Hạn chế của phương pháp này là bộ nhớ được cấp phát cho một mảng hoàn toàn mới mỗi khi nó được gọi. Khi phát triển một mảng cho một lượng mẫu đáng kể, tốt hơn là nên phân bổ trước mảng (nếu biết tổng kích thước) hoặc thêm vào danh sách và chuyển đổi thành mảng sau đó.

Sử dụng np.append:

b = np.array([0])
for k in range(int(10e4)):
    b = np.append(b, k)
1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Sử dụng danh sách python chuyển đổi thành mảng sau đó:

d = [0]
for k in range(int(10e4)):
    d.append(k)
f = np.array(d)
13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Phân bổ trước mảng numpy:

e = np.zeros((n,))
for k in range(n):
    e[k] = k
9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Khi kích thước cuối cùng chưa được xác định, việc phân bổ trước rất khó khăn, tôi đã thử phân bổ trước theo khối 50 nhưng nó không gần bằng cách sử dụng danh sách.

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

14

a[0]không phải là một mảng, nó là phần tử đầu tiên của avà do đó không có thứ nguyên.

a[0:1]Thay vào đó, hãy thử sử dụng , nó sẽ trả về phần tử đầu tiên của abên trong một mảng mục.


12

Thử cái này:

np.concatenate((a, np.array([a[0]])))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

concatenate cần cả hai phần tử là mảng numpy; tuy nhiên, [0] không phải là một mảng. Đó là lý do tại sao nó không hoạt động.


Hoặc, đơn giản hơn np.concatenate((a, [a[0]])). Danh sách sẽ tự động được thăng cấp thành kiểu mảng, giúp bạn tiết kiệm một số thao tác nhập.
Mad Physicist

10

Lệnh này,

numpy.append(a, a[0])

không làm thay đổi amảng. Tuy nhiên, nó trả về một mảng mới được sửa đổi. Vì vậy, nếu acần phải sửa đổi, thì phải sử dụng những điều sau đây.

a = numpy.append(a, a[0])


3

Điều này có thể hơi quá mức cần thiết, nhưng tôi luôn sử dụng np.takehàm này cho bất kỳ lập chỉ mục nào:

>>> a = np.array([1, 2, 3])
>>> np.take(a, range(0, len(a)+1), mode='wrap')
array([1, 2, 3, 1])

>>> np.take(a, range(-1, len(a)+1), mode='wrap')
array([3, 1, 2, 3, 1])

2

Hãy nói a=[1,2,3]và bạn muốn nó được [1,2,3,1].

Bạn có thể sử dụng chức năng append tích hợp sẵn

np.append(a,1)

Ở đây 1 là int, nó có thể là một chuỗi và nó có thể thuộc về các phần tử trong mảng hoặc không. Bản in:[1,2,3,1]


Chào mừng bạn đến với StackOverflow! Bạn có thể muốn đọc hướng dẫn này về cách định dạng mã và sau đó cập nhật câu trả lời của bạn để nó có thể đọc được nhiều hơn :) Ngoài ra đây là một câu hỏi rất cũ với một câu trả lời được chấp nhận, tốt hơn để trả lời một số những cái mới
0mpurdy

0

Nếu bạn muốn thêm một phần tử sử dụng append()

a = numpy.append(a, 1) trong trường hợp này, hãy thêm số 1 vào cuối mảng

Nếu bạn muốn chèn một phần tử, hãy sử dụng insert()

a = numpy.insert(a, index, 1) trong trường hợp này, bạn có thể đặt số 1 ở nơi bạn muốn, sử dụng chỉ mục để đặt vị trí trong mảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.