2012-01-17 35 views
23

Tôi có hai mảng numpy với ba kích thước (3 x 4 x 5) và tôi muốn nối chúng sao cho kết quả có bốn kích thước (3 x 4 x 5 x 2). Trong Matlab, điều này có thể được thực hiện với cat(4, a, b), nhưng không phải trong Numpy.Kết hợp hai mảng có khối u ở kích thước thứ 4

Ví dụ:

a = ones((3,4,5)) 
b = ones((3,4,5)) 
c = concatenate((a,b), axis=3) # error! 

Để làm rõ, tôi muốn c[:,:,:,0]c[:,:,:,1] để tương ứng với hai mảng gốc.

Trả lời

4

gì về

c = np.stack((a,b), axis=3) 
+1

Chức năng này được thêm vào trong phiên bản 1.10 và làm cho thao tác này trở nên thanh lịch hơn. –

1

này làm việc cho tôi:

c = numpy.array([a,b]) 

Mặc dù nó sẽ được tốt đẹp nếu nó làm việc theo cách của bạn, quá.

+0

Tôi cố gắng đó, nhưng nó kết quả trong một (2 x 3 x 4 x 5) mảng. Đóng, nhưng không hoàn toàn. –

12

Làm thế nào về những điều sau đây:

c = concatenate((a[:,:,:,None],b[:,:,:,None]), axis=3) 

Điều này cho phép một (3 x 4 x 5 x 2) mảng, mà tôi tin là đặt ra theo cách bạn yêu cầu.

Ở đây, None đồng nghĩa với np.newaxis: Numpy: Should I use newaxis or None?

chỉnh sửa Theo đề nghị của @Joe Kington, mã có thể được làm sạch lên một chút bằng cách sử dụng một dấu chấm lửng:

c = concatenate((a[...,None],b[...,None]), axis=3) 
+0

đánh bại tôi một vài giây. . .dammit :-) Tôi sẽ đổ lỗi cho nó khi gõ 'np.newaxis', thay vì' None' +1 cho bạn – JoshAdel

+0

@JoshAdel: LOL, nhưng bạn đã lưu trên không phải gõ tất cả các dấu hai chấm gây phiền nhiễu đó! :-) – NPE

+0

Hoạt động như một sự quyến rũ. –

27

Ở đây bạn go:

import numpy as np 
a = np.ones((3,4,5)) 
b = np.ones((3,4,5)) 
c = np.concatenate((a[...,np.newaxis],b[...,np.newaxis]),axis=3) 
+3

Chấp nhận điều này để dễ đọc hơn một chút. Thêm vào đó nó đã giải phóng cho tôi về sự thiếu hiểu biết của tôi về toán tử '...'. –

+7

Nếu bạn có một chuỗi các mảng mà bạn muốn ngăn xếp theo cách này, bạn có thể sử dụng: 'c = np.concatenate ([aux [..., np.newaxis] cho aux trong sequence_of_arrays], axis = 3)' –

+6

Thêm nói chung, bạn có thể sử dụng 'axis = -1' bất kể số thứ nguyên trong mảng ban đầu. –

0

Nó không nhất thiết phải thanh lịch nhất, nhưng tôi đã sử dụng các biến thể của

c = rollaxis(array([a,b]), 0, 4) 

trước đây.

8

Câu trả lời được chấp nhận ở trên là rất tốt. Nhưng tôi sẽ thêm những điều sau đây bởi vì tôi là một dork toán học và nó là một sử dụng tốt đẹp của thực tế là a.shapea.T.shape[::-1] ... tức là. lấy một transpose đảo ngược thứ tự của các chỉ số của một mảng numpy. Vì vậy, nếu bạn có các khối xây dựng của bạn trong một mảng gọi là khối, sau đó giải pháp trên là:

new = np.concatenate([block[..., np.newaxis] for block in blocks], 
        axis=len(blocks[0].shape)) 

nhưng bạn cũng có thể làm

new2 = np.array([block.T for block in blocks]).T 

mà tôi nghĩ đọc sạch hơn. Nó đáng chú ý là câu trả lời đã được chấp nhận chạy nhanh hơn:

%%timeit 
new = np.concatenate([block[..., np.newaxis] for block in blocks], 
        axis=len(blocks[0].shape)) 
1000 loops, best of 3: 321 µs per loop 

khi

%%timeit 
new2 = np.array([block.T for block in blocks]).T 
1000 loops, best of 3: 407 µs per loop 
+1

Đó là một giải pháp đáng yêu, sáng tạo. –

+0

Đây là những gì tôi cần và nó là bất khả tri của tổng số kích thước cho bất kỳ mảng numpy nào. Cảm ơn! – rayryeng

Các vấn đề liên quan