Nối một mảng NumPy vào một mảng NumPy


178

Tôi có một numpy_array. Một cái gì đó như [ a b c ].

Và sau đó tôi muốn nối nó vào một mảng NumPy khác (giống như chúng ta tạo một danh sách các danh sách). Làm thế nào để chúng ta tạo ra một mảng các mảng NumPy chứa các mảng NumPy?

Tôi đã cố gắng làm những điều sau đây mà không gặp may mắn

>>> M = np.array([])
>>> M
array([], dtype=float64)
>>> M.append(a,axis=0)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'append'
>>> a
array([1, 2, 3])

3
Bạn có thể tạo một "mảng mảng" (bạn sử dụng một mảng đối tượng), nhưng bạn gần như chắc chắn không muốn. Bạn đang cố làm gì vậy? Bạn chỉ muốn một mảng 2d?
Joe Kington

Câu trả lời:


213
In [1]: import numpy as np

In [2]: a = np.array([[1, 2, 3], [4, 5, 6]])

In [3]: b = np.array([[9, 8, 7], [6, 5, 4]])

In [4]: np.concatenate((a, b))
Out[4]: 
array([[1, 2, 3],
       [4, 5, 6],
       [9, 8, 7],
       [6, 5, 4]])

hoặc này:

In [1]: a = np.array([1, 2, 3])

In [2]: b = np.array([4, 5, 6])

In [3]: np.vstack((a, b))
Out[3]: 
array([[1, 2, 3],
       [4, 5, 6]])

1
Xin chào khi tôi chạy cái này, tôi nhận được np.concatenate này ((a, b), angle = 1) ?
frazman

3
@Fraz: Tôi đã thêm vstack()ý tưởng của Sven . Bạn biết bạn có thể tạo mảng với array([[1,2,3],[2,3,4]]), phải không?
endolith

concatenate () là cái tôi cần.
kakyo

1
numpy.vstackcó thể chấp nhận nhiều hơn 2 mảng trong đối số chuỗi. Do đó, nếu bạn cần kết hợp nhiều hơn 2 mảng, vstack sẽ tiện dụng hơn.
ruhong

1
@oneleggedmule concatenatecũng có thể mất nhiều mảng
endolith

73

Chà, thông báo lỗi nói lên tất cả: Mảng NumPy không có append()phương thức. Tuy nhiên, có một chức năng miễn phí numpy.append():

numpy.append(M, a)

Điều này sẽ tạo ra một mảng mới thay vì đột biến Mtại chỗ. Lưu ý rằng việc sử dụng numpy.append()liên quan đến việc sao chép cả hai mảng. Bạn sẽ nhận được mã hiệu suất tốt hơn nếu bạn sử dụng mảng NumPy có kích thước cố định.


Xin chào .. khi tôi thử điều này .. tôi nhận được mảng này >>> np.append (M, a) ([1., 2., 3.]) >>> np.append (M, b) mảng ([ 2., 3., 4.]) >>> M mảng ([], dtype = float64) Tôi đã hy vọng M là mảng 2D ??
frazman

8
@Fraz: Có một cái nhìn numpy.vstack().
Sven Marnach

Tôi nghĩ rằng đây nên là câu trả lời được chấp nhận vì nó trả lời chính xác cho điểm.
Prasad Raghavendra

31

Bạn có thể sử dụng numpy.append()...

import numpy

B = numpy.array([3])
A = numpy.array([1, 2, 2])
B = numpy.append( B , A )

print B

> [3 1 2 2]

Điều này sẽ không tạo ra hai mảng riêng biệt nhưng sẽ nối hai mảng thành một mảng một chiều.


10

Sven đã nói tất cả, chỉ cần rất thận trọng vì điều chỉnh loại tự động khi gọi thêm.

In [2]: import numpy as np

In [3]: a = np.array([1,2,3])

In [4]: b = np.array([1.,2.,3.])

In [5]: c = np.array(['a','b','c'])

In [6]: np.append(a,b)
Out[6]: array([ 1.,  2.,  3.,  1.,  2.,  3.])

In [7]: a.dtype
Out[7]: dtype('int64')

In [8]: np.append(a,c)
Out[8]: 
array(['1', '2', '3', 'a', 'b', 'c'], 
      dtype='|S1')

Như bạn thấy dựa trên nội dung, dtype đã chuyển từ int64 sang float32, rồi đến S1


7

Tôi tìm thấy liên kết này trong khi tìm kiếm một cái gì đó hơi khác, làm thế nào để bắt đầu nối các đối tượng mảng vào chỗ trống mảng numpy , nhưng đã thử tất cả các giải pháp trên trang này nhưng không có kết quả.

Sau đó, tôi tìm thấy câu hỏi và câu trả lời này: Làm thế nào để thêm một hàng mới vào một mảng numpy trống

Ý chính ở đây:

Cách để "bắt đầu" mảng mà bạn muốn là:

arr = np.empty((0,3), int)

Sau đó, bạn có thể sử dụng concatenate để thêm các hàng như vậy:

arr = np.concatenate( ( arr, [[x, y, z]] ) , axis=0)

Xem thêm https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html


4

Trên thực tế, người ta luôn có thể tạo một danh sách bình thường của các mảng numpy và chuyển đổi nó sau này.

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

In [3]: b = np.array([[1,2],[3,4]])

In [4]: l = [a]

In [5]: l.append(b)

In [6]: l = np.array(l)

In [7]: l.shape
Out[7]: (2, 2, 2)

In [8]: l
Out[8]: 
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])

2

Tôi có cùng một vấn đề và tôi không thể nhận xét về câu trả lời của @Sven Marnach (không đủ đại diện, tôi nhớ khi Stackoverflow lần đầu tiên bắt đầu ...).

Thêm danh sách các số ngẫu nhiên vào ma trận 10 X 10.

myNpArray = np.zeros([1, 10])
for x in range(1,11,1):
    randomList = [list(np.random.randint(99, size=10))]
    myNpArray = np.vstack((myNpArray, randomList))
myNpArray = myNpArray[1:]

Sử dụng np.zeros () một mảng được tạo với 1 x 10 số không.

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

Sau đó, một danh sách gồm 10 số ngẫu nhiên được tạo bằng np.random và được gán cho RandomList. Các vòng lặp xếp chồng nó cao 10. Chúng ta chỉ cần nhớ để loại bỏ mục trống đầu tiên.

myNpArray

array([[31., 10., 19., 78., 95., 58.,  3., 47., 30., 56.],
       [51., 97.,  5., 80., 28., 76., 92., 50., 22., 93.],
       [64., 79.,  7., 12., 68., 13., 59., 96., 32., 34.],
       [44., 22., 46., 56., 73., 42., 62.,  4., 62., 83.],
       [91., 28., 54., 69., 60., 95.,  5., 13., 60., 88.],
       [71., 90., 76., 53., 13., 53., 31.,  3., 96., 57.],
       [33., 87., 81.,  7., 53., 46.,  5.,  8., 20., 71.],
       [46., 71., 14., 66., 68., 65., 68., 32.,  9., 30.],
       [ 1., 35., 96., 92., 72., 52., 88., 86., 94., 88.],
       [13., 36., 43., 45., 90., 17., 38.,  1., 41., 33.]])

Vì vậy, trong một chức năng:

def array_matrix(random_range, array_size):
    myNpArray = np.zeros([1, array_size])
    for x in range(1, array_size + 1, 1):
        randomList = [list(np.random.randint(random_range, size=array_size))]
        myNpArray = np.vstack((myNpArray, randomList))
    return myNpArray[1:]

một mảng 7 x 7 sử dụng các số ngẫu nhiên 0 - 1000

array_matrix(1000, 7)

array([[621., 377., 931., 180., 964., 885., 723.],
       [298., 382., 148., 952., 430., 333., 956.],
       [398., 596., 732., 422., 656., 348., 470.],
       [735., 251., 314., 182., 966., 261., 523.],
       [373., 616., 389.,  90., 884., 957., 826.],
       [587., 963.,  66., 154., 111., 529., 945.],
       [950., 413., 539., 860., 634., 195., 915.]])

1

Nếu tôi hiểu câu hỏi của bạn, đây là một cách. Nói rằng bạn có:

a = [4.1, 6.21, 1.0]

vì vậy đây là một số mã ...

def array_in_array(scalarlist):
    return [(x,) for x in scalarlist]

Điều này dẫn đến:

In [72]: a = [4.1, 6.21, 1.0]

In [73]: a
Out[73]: [4.1, 6.21, 1.0]

In [74]: def array_in_array(scalarlist):
   ....:     return [(x,) for x in scalarlist]
   ....: 

In [75]: b = array_in_array(a)

In [76]: b
Out[76]: [(4.1,), (6.21,), (1.0,)]

0

Hãy thử mã này:

import numpy as np

a1 = np.array([])

n = int(input(""))

for i in range(0,n):
    a = int(input(""))
    a1 = np.append(a, a1)
    a = 0

print(a1)

Ngoài ra, bạn có thể sử dụng mảng thay vì "a"

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.