nềnhiệu quả thực hiện Python so sánh mảng NumPy
Tôi có hai mảng NumPy mà tôi muốn sử dụng để thực hiện một số thao tác so sánh trong thư mục/cách nhanh chóng hiệu quả nhất có thể. Cả hai chỉ chứa int không dấu.
pairs
là một mảng n x 2 x 3
, nắm giữ một danh sách dài các tọa độ 3D cặp (đối với một số thuật ngữ, các mảng pairs
chứa một tập các cặp ...) - tức là
# full pairs array
In [145]: pairs
Out[145]:
array([[[1, 2, 4],
[3, 4, 4]],
.....
[[1, 2, 5],
[5, 6, 5]]])
# each entry contains a pair of 3D coordinates
In [149]: pairs[0]
Out[149]:
array([[1, 2, 4],
[3, 4, 4]])
positions
là một mảng n x 3
nắm giữ một bộ 3D phối
In [162]: positions
Out[162]:
array([[ 1, 2, 4],
[ 3, 4, 5],
[ 5, 6, 3],
[ 3, 5, 6],
[ 6, 7, 5],
[12, 2, 5]])
Goal tôi muốn tạo ra một mảng whi ch là một tập hợp con của mảng pairs
, nhưng chứa các mục chỉ có tối đa một trong các cặp nằm trong mảng vị trí - nghĩa là không có cặp nào mà cặp BOTH nằm trong mảng vị trí. Đối với một số thông tin tên miền, mỗi cặp sẽ có ít nhất một trong các vị trí ghép đôi bên trong danh sách vị trí.
phương pháp tiếp cận cố gắng cho đến nay cách tiếp cận ngây thơ ban đầu của tôi là để lặp qua mỗi cặp trong mảng pairs
, và trừ mỗi hai vị trí cặp từ positions
vector, việc xác định nếu trong cả hai trường hợp, chúng tôi thấy một trận đấu chỉ định bởi sự hiện diện của một 0 ở cả các vectơ mà đến từ các hoạt động trừ:
if (~(positions-pair[0]).any(axis=1)).any() and
(~(positions-pair[1]).any(axis=1)).any():
# both members of the pair were in the positions array -
# these weren't the droids we were looking for
pass
else:
# append this set of pairs to a new matrix
này hoạt động tốt, và lợi dụng một số vector hóa, nhưng có lẽ là một cách tốt hơn để làm điều này?
Đối với một số phần nhạy cảm về hiệu suất của chương trình này, tôi đã viết lại những thứ với Cython, nó đã mang lại một tốc độ lớn, mặc dù trong trường hợp này (ít nhất là dựa trên một thực thi lồng nhau ngây thơ) chậm hơn so với cách tiếp cận được nêu ở trên.
Nếu mọi người có đề xuất, tôi vui mừng được hồ sơ và báo cáo lại (Tôi có tất cả các cơ sở hạ tầng định cấu hình).
Phương pháp được sử dụng trong http://stackoverflow.com/a/31889183/901925 nên làm việc. Nó mở rộng các kích thước (hoặc một hoặc cả hai mảng) để bạn có thể thực hiện một phần tử bằng so sánh phần tử và sau đó sử dụng 'tất cả' để hợp nhất kết quả trên một hoặc nhiều thứ nguyên. Hoặc trong trường hợp của bạn, tôi sẽ sử dụng 'hàng' mà 'tổng hợp' là 1. Tôi có thể giải thích về điều này sau. – hpaulj