239

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?

|
349

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 các 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, đặt cược 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.]])
|
79

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 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 danh sách cho đến khi kết thúc, 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à cách thực hành tốt vì nó che dấu loại tích hợp theo tên đó, điều này có thể dẫn đến lỗi.)

CHỈNH SỬA:

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!

|
38

Để 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ể ép về 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.]]
|
22

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 trường học của tôi và tôi cần được khởi tạo trống ... Tôi không tìm thấy bất kỳ câu trả lời có liên quan nào ở đâ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.

|
6

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.
|
2

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]
|
1

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 .

|
0

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)
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.