2014-09-18 38 views
7

Tôi đang bước đột phá thực sự đầu tiên vào Python và NumPy để thực hiện một số xử lý hình ảnh. Tôi có một hình ảnh được tải dưới dạng Mảng NumPy 3 chiều, trong đó trục 0 đại diện cho các dải hình ảnh, trong khi các trục 1 và 2 đại diện cho các cột và các hàng pixel. Từ đây, tôi cần lấy ma trận 3x1 đại diện cho mỗi điểm ảnh và thực hiện một vài phép toán dẫn đến một ma trận 3x1 khác, sẽ được sử dụng để xây dựng một hình ảnh kết quả.Nhân ma trận yếu tố khôn ngoan trong NumPy

Tiếp cận của tôi đầu tiên (giản thể và với dữ liệu ngẫu nhiên) trông như thế này:

import numpy as np 
import random 

factor = np.random.rand(3,3) 
input = np.random.rand(3,100,100) 
results = np.zeros((3,100,100)) 

for x in range(100): 
    for y in range(100): 
     results[:,x,y] = np.dot(factor,input[:,x,y]) 

Nhưng điều này đập vào mắt tôi như không thanh nha và không hiệu quả. Có cách nào để làm điều này trong một fasion yếu tố khôn ngoan, ví dụ .:

results = np.dot(factor,input,ElementWiseOnAxis0) 

Trong cố gắng để tìm một giải pháp cho vấn đề này, tôi tình cờ gặp this câu hỏi, mà rõ ràng là khá tương tự. Tuy nhiên, tác giả đã không thể giải quyết vấn đề cho sự hài lòng của họ. Tôi hy vọng rằng một cái gì đó đã thay đổi kể từ năm 2012, hoặc vấn đề của tôi là hoàn toàn khác với vấn đề của họ để làm cho nó dễ dàng giải quyết được hơn.

Trả lời

10

Các mảng cố định sử dụng phép nhân theo yếu tố theo mặc định. Kiểm tra numpy.einsum và numpy.tensordot. Tôi nghĩ rằng những gì bạn đang tìm kiếm là một cái gì đó như thế này:

results = np.einsum('ij,jkl->ikl',factor,input) 
+0

Điều này làm việc hoàn hảo cho những dữ liệu này và cũng nên thích ứng với các vấn đề tương tự! – Joe

+1

Trong trường hợp hình dạng đầu vào của tôi là: (100, 100, 3). Đã cho tôi một thời gian để hiểu nó, nhưng có thể hữu ích cho người khác. Trong trường hợp của tôi là: kết quả = np.einsum ('ij, klj-> kli', hệ số, đầu vào) – Luigolas

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