Với lời giải thích tuyệt vời của ubuntu, bạn có thể sử dụng reduce
để giải quyết vấn đề của mình, nhưng bạn phải áp dụng nó cho bitwise_and
và bitwise_or
thay vì equal
. Kết quả là, điều này sẽ không hoạt động với mảng dấu phẩy động:
Về cơ bản, bạn đang so sánh các bit của từng phần tử trong cột. Các bit giống nhau không thay đổi. Các bit khác nhau được đặt thành 0. Bằng cách này, bất kỳ số nào có số không thay vì một bit sẽ thay đổi giá trị đã giảm. bitwise_and
sẽ không bẫy trường hợp bit được giới thiệu thay vì bị xóa:
In [62]: c = np.array([[1,0,0],[1,0,0],[1,0,0],[1,1,0]])
In [63]: c
Out[63]:
array([[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
[1, 1, 0]])
In [64]: np.bitwise_and.reduce(c) == c[0]
Out[64]: array([ True, True, True], dtype=bool)
Cuộc đảo chính thứ hai rõ ràng là sai.Chúng ta cần phải sử dụng bitwise_or
để bẫy bit mới:
In [66]: np.bitwise_or.reduce(c) == c[0]
Out[66]: array([ True, False, True], dtype=bool)
cuối cùng trả lời
In [69]: np.logical_and(np.bitwise_or.reduce(a) == a[0], np.bitwise_and.reduce(a) == a[0])
Out[69]: array([ True, False, True], dtype=bool)
In [70]: np.logical_and(np.bitwise_or.reduce(b) == b[0], np.bitwise_and.reduce(b) == b[0])
Out[70]: array([ True, False, True], dtype=boo
In [71]: np.logical_and(np.bitwise_or.reduce(c) == c[0], np.bitwise_and.reduce(c) == c[0])
Out[71]: array([ True, False, True], dtype=bool)
Phương pháp này hạn chế hơn và ít thanh lịch hơn đề nghị ubunut của của việc sử dụng all
, nhưng nó có lợi thế là không tạo ra các mảng tạm thời khổng lồ nếu đầu vào của bạn là rất lớn. Các mảng tạm thời chỉ nên lớn bằng hàng đầu tiên của ma trận của bạn.
EDIT
Dựa trên Q/A này và the bug I filed with numpy, giải pháp duy nhất cung cấp các công trình vì mảng của bạn có chứa số không và những người thân. Khi điều đó xảy ra, các hoạt động bitwise_and.reduce()
được hiển thị chỉ có thể trả về 0 hoặc một vì bitwise_and.identity
là 1
, không phải -1
. Tôi đang giữ câu trả lời này với hy vọng rằng numpy
được sửa chữa và câu trả lời trở nên hợp lệ.
Sửa
Hình như có trong thực tế sẽ có một sự thay đổi để NumPy sớm. Chắc chắn là bitwise_and.identity
và cũng có thể là thông số tùy chọn để giảm.
Sửa
Tin tốt tất cả mọi người. Danh tính cho np.bitwise_and
đã được đặt thành -1
kể từ phiên bản 1.12.0
.
Sự cố này đã khiến tôi lo lắng một thời gian. Trong khi giải pháp của Ubuntu là đủ thanh lịch, nó không phải là rất dễ chịu để cố gắng chạy này trên một mảng 4096 ** 3 đôi chỉ để có được một mảng boolean mà hogs bất cứ điều gì bộ nhớ bạn đã để lại. Tôi đã chơi đùa với việc triển khai Python thuần túy bằng cách sử dụng 'np.equal (a, a [:, 0, None])', nhưng điều đó kết thúc với cùng một vấn đề. Do đó, tôi đang làm việc trên một PR cho numpy để thêm một hàm mới 'np.same' để xử lý chính xác kiểu tình huống này. –