Numpy - thêm hàng vào mảng


161

Làm thế nào để thêm một hàng vào một mảng numpy?

Tôi có một mảng A:

A = array([[0, 1, 2], [0, 2, 0]])

Tôi muốn thêm các hàng vào mảng này từ một mảng X khác nếu phần tử đầu tiên của mỗi hàng trong X đáp ứng một điều kiện cụ thể.

Mảng Numpy không có phương thức 'chắp thêm' như danh sách, hoặc có vẻ như vậy.

Nếu A và X là danh sách, tôi sẽ chỉ làm:

for i in X:
    if i[0] < 3:
        A.append(i)

Có một cách numpythonic để làm tương đương?

Cảm ơn, S ;-)


Câu trả lời:


120

Xgì Nếu nó là một mảng 2D, làm thế nào bạn có thể so sánh hàng của nó với một số : i < 3?

EDIT sau bình luận của OP:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])

thêm vào Atất cả các hàng từ Xnơi phần tử đầu tiên < 3:

import numpy as np
A = np.vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])

1
Xin lỗi điểm tốt! Giả sử một mảng 2D trong đó phần tử đầu tiên của mỗi hàng phải đáp ứng một điều kiện. Tôi sẽ chỉnh sửa nó. Cảm ơn, S ;-)
Darren J. Fitzpatrick

2
@ DarrenJ.Fitzpatrick Hãy nhớ rằng bằng cách thực hiện loại thao tác này, bạn sẽ chống lại công việc tốt mà Numpy thực hiện trong việc cấp phát bộ nhớ cho mảng hiện có của bạn A. Rõ ràng đối với vấn đề nhỏ như trong câu trả lời này, đây không phải là vấn đề, nhưng nó có thể gây rắc rối hơn cho dữ liệu lớn.
dtlussier

166

bạn cũng có thể làm điều này:

  newrow = [1,2,3]
  A = numpy.vstack([A, newrow])

2
@Kris Tại sao nó bị phản đối? Tôi không thấy gì trong tài liệu
Georgy

1
@Georgy Thành thật mà nói, tôi không biết. Tôi đã ở đây để tìm kiếm câu trả lời giống như bạn :-). Bây giờ tôi không thể nhớ tại sao tôi viết bình luận ở trên. Tôi phải đã nhìn thấy trong các tài liệu không dùng nữa. Nhưng nhìn vào các tài liệu bây giờ ... nó không nói như vậy. Có thể họ đã từ chối nó, sau đó thay đổi suy nghĩ của họ một lần nữa và quyết định rằng nó sẽ quá khó chịu với quá nhiều người để phản đối và loại bỏ nó?
Kris

32

Vì câu hỏi này đã được 7 năm trước, trong phiên bản mới nhất mà tôi đang sử dụng là phiên bản numpy 1.13 và python3, tôi đang làm điều tương tự với việc thêm một hàng vào ma trận, hãy nhớ đặt dấu ngoặc kép cho đối số thứ hai, nếu không, nó sẽ tăng lỗi kích thước.

Ở đây tôi đang thêm vào ma trận A

1 2 3
4 5 6

với một hàng

7 8 9

sử dụng tương tự trong np.r_

A= [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)

    >> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
#or 
np.r_[A,[[7,8,9]]]

Chỉ cần một ai đó xen vào, nếu bạn muốn thêm một cột,

array = np.c_[A,np.zeros(#A's row size)]

theo những gì chúng ta đã làm trước đây trên ma trận A, thêm một cột vào nó

np.c_[A, [2,8]]

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])

10

Bạn cũng có thể làm điều này:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))

2
hừm Khi tôi thử điều này, nó chỉ thêm vào cuối A, thay vì thêm một hàng mới như OP yêu cầu.
Todd Curry

13
có lẽnp.concatenate((A,newrow), axis=0)
Konstantinos Roditakis

3
Là phiên bản numpy 1.12.1(và trong Python 3), có vẻ như cố gắng nối một vectơ với ma trận tăng ValueError: all the input arrays must have same number of dimensions. Có vẻ như nó muốn vectơ được định hình lại một cách rõ ràng thành một vectơ cột hoặc hàng trước khi nó sẵn sàng nối nó.
MRule

3
@MRule bạn có thể khắc phục điều đó bằng cách sử dụng dấu ngoặc vuông đôi theo câu trả lời từ @Flora PJ Li stackoverflow.com/a/47845065/1410035 . newrow = [[1,2,3]]
Tom Saleeba

10

Nếu không có tính toán nào là cần thiết sau mỗi hàng, thì việc thêm hàng vào python sẽ nhanh hơn nhiều, sau đó chuyển đổi thành numpy. Dưới đây là các thử nghiệm thời gian sử dụng python 3.6 so với numpy 1.14, thêm 100 hàng, mỗi hàng một lần:

import numpy as np 
from time import perf_counter, sleep

def time_it():
    # Compare performance of two methods for adding rows to numpy array
    py_array = [[0, 1, 2], [0, 2, 0]]
    py_row = [4, 5, 6]
    numpy_array = np.array(py_array)
    numpy_row = np.array([4,5,6])
    n_loops = 100

    start_clock = perf_counter()
    for count in range(0, n_loops):
       numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
    duration = perf_counter() - start_clock
    print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))

    start_clock = perf_counter()
    for count in range(0, n_loops):
        py_array.append(py_row) # .15 micros
    numpy_array = np.array(py_array) # 43.9 micros       
    duration = perf_counter() - start_clock
    print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
    sleep(15)

#time_it() prints:

numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row

Vì vậy, giải pháp đơn giản cho câu hỏi ban đầu, từ bảy năm trước, là sử dụng vstack () để thêm một hàng mới sau khi chuyển đổi hàng thành một mảng numpy. Nhưng một giải pháp thực tế hơn nên xem xét hiệu suất kém của vstack trong những trường hợp đó. Nếu bạn không cần chạy phân tích dữ liệu trên mảng sau mỗi lần thêm, tốt hơn là đệm các hàng mới vào danh sách hàng python (thực sự là một danh sách các danh sách) và thêm chúng thành một nhóm vào mảng numpy sử dụng vstack () trước khi thực hiện bất kỳ phân tích dữ liệu.


5
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

array_ = np.concatenate((array_, add_row), axis=0)

3

Nếu bạn có thể thực hiện việc xây dựng trong một thao tác duy nhất, thì một câu trả lời như vstack-with-Fancy-index là một cách tiếp cận tốt. Nhưng nếu điều kiện của bạn phức tạp hơn hoặc các hàng của bạn xuất hiện nhanh chóng, bạn có thể muốn phát triển mảng. Trong thực tế, cách thức numpythonic để làm một cái gì đó như thế này - tự động phát triển một mảng - là tự động phát triển một danh sách:

A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
    newrow = np.arange(3)+i
    if i%5:
        Alist.append(newrow)
A = np.array(Alist)
del Alist

Danh sách được tối ưu hóa cao cho loại mẫu truy cập này; bạn không có lập chỉ mục đa chiều tiện lợi khi ở dạng danh sách, nhưng miễn là bạn đang nối thêm thì khó có thể làm tốt hơn danh sách các mảng hàng.


3

Tôi sử dụng 'np.vstack' nhanh hơn, EX:

import numpy as np

input_array=np.array([1,2,3])
new_row= np.array([4,5,6])

new_array=np.vstack([input_array, new_row])

2

Bạn có thể sử dụng numpy.append()để nối một hàng vào mảng numpty và định hình lại thành ma trận sau này.

import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
    A = np.append(A, row)
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.