Làm cách nào để tạo một mảng / ma trận trống trong NumPy?


311

Tôi không thể tìm ra cách sử dụng một mảng hoặc ma trận theo cách mà tôi thường sử dụng một danh sách. Tôi muốn tạo một mảng trống (hoặc ma trận) và sau đó thêm một cột (hoặc hàng) vào nó tại một thời điểm.

Hiện tại, cách duy nhất tôi có thể tìm thấy để làm điều này là:

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

Trong khi đó nếu nó là một danh sách, tôi sẽ làm một cái gì đó như thế này:

list = []
for item in data:
    list.append(item)

Có cách nào để sử dụng loại ký hiệu đó cho mảng NumPy hoặc ma trận không?

Câu trả lời:


441

Bạn có mô hình tinh thần sai lầm khi sử dụng NumPy một cách hiệu quả. Mảng NumPy được lưu trữ trong các khối bộ nhớ liền kề. Nếu bạn muốn thêm hàng hoặc cột vào một mảng hiện có, toàn bộ mảng cần được sao chép vào một khối bộ nhớ mới, tạo ra các khoảng trống cho các phần tử mới sẽ được lưu trữ. Điều này rất không hiệu quả nếu được thực hiện nhiều lần để xây dựng một mảng.

Trong trường hợp thêm hàng, cách tốt nhất của bạn là tạo một mảng lớn như tập dữ liệu của bạn cuối cùng, và sau đó thêm dữ liệu vào từng hàng:

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

123
Ngoài ra còn có numpy.empty () nếu bạn không cần 0 mảng.
janneb

21
Lợi ích của việc sử dụng rỗng () so với số không () là gì?
Zach

45
rằng nếu bạn sẽ khởi tạo nó ngay lập tức với dữ liệu của mình, bạn sẽ tiết kiệm được chi phí cho việc xóa dữ liệu.
marcorossi

16
@maracorossi .empty()có nghĩa là người ta có thể tìm thấy các giá trị ngẫu nhiên trong các ô, nhưng mảng được tạo nhanh hơn ví dụ với .zeros()?
dùng3085931

6
@ user3085931 vâng!
Nathan

98

Mảng NumPy là một cấu trúc dữ liệu rất khác với danh sách và được thiết kế để được sử dụng theo những cách khác nhau. Việc sử dụng của bạn hstackcó khả năng rất kém hiệu quả ... mỗi khi bạn gọi nó, tất cả dữ liệu trong mảng hiện có được sao chép vào một dữ liệu mới. ( appendHàm này sẽ có cùng một vấn đề.) Nếu bạn muốn xây dựng một cột ma trận của mình tại một thời điểm, tốt nhất bạn nên giữ nó trong một danh sách cho đến khi hoàn thành, và chỉ sau đó chuyển đổi nó thành một mảng.

ví dụ


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

itemcó thể là một danh sách, một mảng hoặc bất kỳ lần lặp nào, miễn là mỗi phần tử itemcó cùng số phần tử.
Trong trường hợp cụ thể này ( datalà một số lần lặp giữ các cột ma trận), bạn có thể chỉ cần sử dụng


mat = numpy.array(data)

(Cũng lưu ý rằng sử dụng listlàm tên biến có lẽ không phải là thông lệ tốt vì nó che dấu loại tích hợp theo tên đó, có thể dẫn đến lỗi.)

BIÊN TẬP:

Nếu vì lý do nào đó bạn thực sự muốn tạo một mảng trống, bạn chỉ có thể sử dụng numpy.array([]), nhưng điều này hiếm khi hữu ích!


1
Các mảng / ma trận numpy về cơ bản có khác với Matlab không?
levesque

1
Nếu vì lý do nào đó bạn cần xác định một mảng trống, nhưng với chiều rộng cố định (ví dụ np.concatenate()), bạn có thể sử dụng : np.empty((0, some_width)). 0, vì vậy mảng đầu tiên của bạn sẽ không phải là rác.
NumeSanguis

56

Để tạo một mảng đa chiều trống trong NumPy (ví dụ: mảng 2D m*nđể lưu trữ ma trận của bạn), trong trường hợp bạn không biết mbạn sẽ nối thêm bao nhiêu hàng và không quan tâm đến chi phí tính toán mà Stephen Simmons đã đề cập (cụ thể là xây dựng lại ở mỗi phần bổ sung), bạn có thể nén thành 0 thứ nguyên mà bạn muốn thêm vào : X = np.empty(shape=[0, n]).

Bằng cách này, bạn có thể sử dụng ví dụ (ở đây m = 5chúng tôi giả sử chúng tôi không biết khi tạo ma trận trống và n = 2):

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

sẽ cung cấp cho bạn:

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

1
Đây phải là câu trả lời cho câu hỏi mà OP đã hỏi, đối với trường hợp sử dụng mà bạn không biết trước #bow hoặc muốn xử lý trường hợp có 0 hàng
Spcogg vào

26

Tôi đã xem xét vấn đề này rất nhiều vì tôi cần sử dụng numpy.array như một bộ trong một trong các dự án của trường và tôi cần được khởi tạo trống ... Tôi không tìm thấy câu trả lời nào có liên quan ở đây trên Stack Overflow, vì vậy tôi đã bắt đầu vẽ nguệch ngoạc một cái gì đó.

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

Kết quả sẽ là:

In [34]: x
Out[34]: array([], dtype=float64)

Do đó, bạn có thể trực tiếp khởi tạo một mảng np như sau:

In [36]: x= np.array([], dtype=np.float64)

Tôi hi vọng cái này giúp được.


Điều này không làm việc cho các mảng, như trong câu hỏi, nhưng nó có thể hữu ích cho các vectơ.
divenex

a=np.array([])dường như mặc định làfloat64
P i

7

Bạn có thể sử dụng chức năng chắp thêm. Đối với hàng:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

Đối với cột:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

EDIT
Tất nhiên, như đã đề cập trong các câu trả lời khác, trừ khi bạn đang thực hiện một số xử lý (ví dụ đảo ngược) trên ma trận / mảng MERYI lần bạn thêm một cái gì đó vào nó, tôi sẽ chỉ tạo một danh sách, nối nó với nó sau đó chuyển đổi nó thành một mảng.


3

Nếu bạn hoàn toàn không biết kích thước cuối cùng của mảng, bạn có thể tăng kích thước của mảng như thế này:

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • Lưu ý 0trong dòng đầu tiên.
  • numpy.appendlà một lựa chọn khác. Nó gọi numpy.concatenate.

3

Bạn có thể áp dụng nó để xây dựng bất kỳ loại mảng nào, như số không:

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]

4
Nếu bạn muốn làm điều đó trong python thuần, a= [0] * 5là giải pháp đơn giản
Makers_F

3

Đây là một số cách giải quyết để làm cho numpys trông giống như Danh sách

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

OUTPUT: mảng ([2., 24.])


2

Tùy thuộc vào những gì bạn đang sử dụng này để làm gì, bạn có thể cần chỉ định loại dữ liệu (xem 'dtype' ).

Ví dụ: để tạo một mảng 2D gồm các giá trị 8 bit (phù hợp để sử dụng làm hình ảnh đơn sắc):

myarray = numpy.empty(shape=(H,W),dtype='u1')

Đối với hình ảnh RGB, bao gồm số lượng kênh màu trong hình dạng: shape=(H,W,3)

Bạn cũng có thể muốn xem xét khởi tạo bằng numpy.zeroskhông thay vì sử dụng numpy.empty. Xem ghi chú ở đây .


1

Tôi nghĩ rằng bạn muốn xử lý hầu hết các công việc với danh sách sau đó sử dụng kết quả dưới dạng ma trận. Có lẽ đây là một cách;

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)

1

Tôi nghĩ rằng bạn có thể tạo mảng numpy trống như:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

Định dạng này hữu ích khi bạn muốn nối thêm mảng numpy trong vòng lặp.


0

Để tạo một mảng NumPy trống mà không xác định hình dạng của nó, có một cách:

1.

arr = np.array([]) 

ưa thích. bởi vì bạn biết bạn sẽ sử dụng điều này như là numpy.

2.

arr = []
# and use it as numpy. append to it or etc..

NumPy chuyển đổi loại này thành loại np.ndarray sau đó, không có thêm [] dimionsion.


0

Có lẽ những gì bạn đang tìm kiếm là một cái gì đó như thế này:

x=np.array(0)

Bằng cách này, bạn có thể tạo một mảng mà không cần bất kỳ yếu tố nào. Nó tương tự như:

x=[]

Bằng cách này, bạn sẽ có thể nối các phần tử mới vào mảng của mình trước.

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.