2017-10-04 23 views
7

Điều này nghe có vẻ đơn giản, và tôi nghĩ rằng tôi đang overcomplicating này trong tâm trí của tôi.Làm thế nào để có điều kiện kết hợp hai mảng numpy của cùng một hình dạng

Tôi muốn tạo một mảng có các phần tử được tạo từ hai mảng nguồn có cùng hình dạng, tùy thuộc vào phần tử nào trong mảng nguồn lớn hơn.

để minh họa:

import numpy as np 
array1 = np.array((2,3,0)) 
array2 = np.array((1,5,0)) 

array3 = (insert magic) 
>> array([2, 5, 0)) 

Tôi không thể làm việc ra làm thế nào để tạo ra một array3 kết hợp các yếu tố của array1 và array2 để tạo ra một mảng duy nhất mà càng lớn của các giá trị hai array1/yếu tố array2 là Lấy.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn.

Trả lời

18

Chúng ta có thể sử dụng NumPy built-in np.maximum, thực hiện chính xác cho mục đích đó -

np.maximum(array1, array2) 

Một cách khác là sử dụng các NumPy ufunc np.max trên một mảng xếp chồng lên nhau 2Dmax-reduce dọc theo trục đầu tiên (axis=0) -

np.max([array1,array2],axis=0) 

Thời gian trên 1 triệu bộ dữ liệu -

In [271]: array1 = np.random.randint(0,9,(1000000)) 

In [272]: array2 = np.random.randint(0,9,(1000000)) 

In [274]: %timeit np.maximum(array1, array2) 
1000 loops, best of 3: 1.25 ms per loop 

In [275]: %timeit np.max([array1, array2],axis=0) 
100 loops, best of 3: 3.31 ms per loop 

# @Eric Duminil's soln1 
In [276]: %timeit np.where(array1 > array2, array1, array2) 
100 loops, best of 3: 5.15 ms per loop 

# @Eric Duminil's soln2 
In [277]: magic = lambda x,y : np.where(x > y , x, y) 

In [278]: %timeit magic(array1, array2) 
100 loops, best of 3: 5.13 ms per loop 
+0

Ahah. Cảm ơn 'timeit', nhưng rõ ràng là tiêu chuẩn, cách tối ưu hóa nhanh hơn so với tùy chỉnh. Phương pháp của tôi sẽ chỉ có ý nghĩa với một điều kiện phức tạp hơn. –

+1

@EricDuminil Yup hoàn toàn! Chỉ cần cố gắng xem cách thức các phương thức khác nhau xếp chồng lên nhau, cho bản thân tôi và những người khác. – Divakar

12

Nếu tình trạng của bạn bao giờ trở nên phức tạp hơn, bạn có thể sử dụng np.where:

import numpy as np 
array1 = np.array((2,3,0)) 
array2 = np.array((1,5,0)) 
array3 = np.where(array1 > array2, array1, array2) 
# array([2, 5, 0]) 

Bạn có thể thay thế array1 > array2 với điều kiện bất kỳ. Nếu tất cả những gì bạn muốn là tối đa, hãy đi theo số answer của @ Divakar.

Và chỉ để cho vui:

magic = lambda x,y : np.where(x > y , x, y) 
magic(array1, array2) 
# array([2, 5, 0]) 
Các vấn đề liên quan