Trích xuất các cột cụ thể trong mảng numpy


163

Đây là một câu hỏi dễ nhưng nói rằng tôi có ma trận MxN. Tất cả những gì tôi muốn làm là trích xuất các cột cụ thể và lưu trữ chúng trong một mảng numpy khác nhưng tôi nhận được lỗi cú pháp không hợp lệ. Đây là mã:

extractedData = data[[:,1],[:,9]]. 

Có vẻ như dòng trên nên đủ nhưng tôi đoán là không. Tôi nhìn xung quanh nhưng không thể tìm thấy bất cứ cú pháp nào khôn ngoan liên quan đến kịch bản cụ thể này.

Câu trả lời:


271

Tôi giả sử bạn muốn cột 19? Đó là

data[:, [1, 9]]

Hoặc với tên:

data[:, ['Column Name1','Column Name2']]

Bạn có thể lấy tên từ data.dtype.names...


Làm thế nào để làm điều đó với tên cột?
Zelphir Kaltstahl

9
dữ liệu [:, ['Tên cột1', 'Tên cột2']]
mã sát thủ

nó là một cái nhìn hay một bản sao? nút cổ chai của tôi nằm trên dòng này Tôi tìm cách tối ưu hóa
Fractale

1
có thể là chức năng này không hoạt động nữa?
PV8

Cú pháp này được gọi là gì?
Burrito


14

nếu bạn chỉ muốn trích xuất một số cột:

idx_IN_columns = [1, 9]
extractedData = data[:,idx_IN_columns]

nếu bạn muốn loại trừ các cột cụ thể:

idx_OUT_columns = [1, 9]
idx_IN_columns = [i for i in xrange(np.shape(data)[1]) if i not in idx_OUT_columns]
extractedData = data[:,idx_IN_columns]

9

Một điều tôi muốn chỉ ra là, nếu số lượng cột bạn muốn trích xuất là 1 thì ma trận kết quả sẽ không phải là Ma trận Mx1 như bạn mong đợi mà thay vào đó là một mảng chứa các phần tử của cột bạn đã trích xuất.

Để chuyển đổi nó thành Ma trận , phương pháp định hình lại (M, 1) nên được sử dụng trên mảng kết quả.


2
Ngoài ra, bạn có thể đạt được điều này bằng cách sử dụng một dấu hai chấm, ví dụ data[:, 8:9]. Điều này có tám cột nhưng không loại bỏ kích thước thêm.
Jan Kukacka

dữ liệu [:, 8] cũng sẽ chọn cột thứ 8 và trả về Ma trận
Mx1

5

Chỉ:

>>> m = np.matrix(np.random.random((5, 5)))
>>> m
matrix([[0.91074101, 0.65999332, 0.69774588, 0.007355  , 0.33025395],
        [0.11078742, 0.67463754, 0.43158254, 0.95367876, 0.85926405],
        [0.98665185, 0.86431513, 0.12153138, 0.73006437, 0.13404811],
        [0.24602225, 0.66139215, 0.08400288, 0.56769924, 0.47974697],
        [0.25345299, 0.76385882, 0.11002419, 0.2509888 , 0.06312359]])
>>> m[:,[1, 2]]
matrix([[0.65999332, 0.69774588],
        [0.67463754, 0.43158254],
        [0.86431513, 0.12153138],
        [0.66139215, 0.08400288],
        [0.76385882, 0.11002419]])

Các cột không cần phải theo thứ tự:

>>> m[:,[2, 1, 3]]
matrix([[0.69774588, 0.65999332, 0.007355  ],
        [0.43158254, 0.67463754, 0.95367876],
        [0.12153138, 0.86431513, 0.73006437],
        [0.08400288, 0.66139215, 0.56769924],
        [0.11002419, 0.76385882, 0.2509888 ]])

2

Một điều nữa bạn nên chú ý khi chọn các cột từ mảng ND bằng cách sử dụng một danh sách như thế này:

data[:,:,[1,9]]

Nếu bạn đang xóa một thứ nguyên (bằng cách chỉ chọn một hàng chẳng hạn), mảng kết quả sẽ được (vì một số lý do) được hoán vị . Vì thế:

print data.shape            # gives [10,20,30]
selection = data[1,:,[1,9]]
print selection.shape       # gives [2,20] instead of [20,2]!!

1

Bạn có thể dùng :

extracted_data = data.ix[:,['Column1','Column2']]


2
Một câu trả lời tốt sẽ luôn có lời giải thích về những gì đã được thực hiện và tại sao nó được thực hiện theo cách như vậy, không chỉ cho OP mà còn cho khách truy cập tương lai của SO. Vui lòng thêm một số mô tả để làm cho người khác hiểu.
Rucha Bhatt Joshi

-1

Tôi nghĩ rằng giải pháp ở đây không còn hoạt động với bản cập nhật của phiên bản python nữa, một cách để làm điều đó với chức năng python mới cho nó là:

extracted_data = data[['Column Name1','Column Name2']].to_numpy()

cung cấp cho bạn kết quả mong muốn.

Tài liệu bạn có thể tìm thấy ở đây: https://pandas.pydata.org/pandas-docs/urdy/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


câu hỏi bắt đầu bằng một mảng gọn gàng, không phải khung dữ liệu
TMrtSmith

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.