2015-11-12 16 views
8

Vì vậy, trong numpy 1.8.2 (với python 2.7.6) có vẻ như là một vấn đề trong mảng phân chia. Khi thực hiện phân chia tại chỗ của một mảng đủ lớn (ít nhất 8192 phần tử, nhiều hơn một thứ nguyên, kiểu dữ liệu không liên quan) với một phần của chính nó, hành vi không phù hợp với các ký hiệu khác nhau.Hành vi không mong muốn theo dạng gumpy, khi chia mảng

import numpy as np 
arr = np.random.rand(2, 5000) 
arr_copy = arr.copy() 
arr_copy = arr_copy/arr_copy[0] 
arr /= arr[0] 
print np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy)) 

Đầu ra dự kiến ​​là 0, vì hai bộ phận phải nhất quán, nhưng là 1808. Đây có phải là lỗi không? Nó cũng xảy ra trong các phiên bản khác không?

+2

Một đồng nghiệp đã chỉ ra rằng hành vi này có thể là do lý do, rằng arr [0] chỉ là một khung nhìn của arr và do đó bị thay đổi trong quá trình vận hành tại chỗ. – Dschoni

Trả lời

7

Nó không thực sự là một lỗi, như là để làm với kích thước bộ đệm như bạn đề nghị trong câu hỏi. Thiết lập kích thước bộ đệm lớn giúp loại bỏ các vấn đề (cho bây giờ ...):

>>> np.setbufsize(8192*4) # sets new buffer size, returns current size 
8192 
>>> # same set up as in the question 
>>> np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy)) 
(0, 0) 

Và như bạn nêu trong các bình luận, bộ phận inplace arr /= arr[0] là nơi này ban đầu gặp khó khăn. Chỉ 8192 thành phần đầu tiên của arr được đệm với arr[0] chỉ đơn giản là một cái nhìn của hàng đầu tiên của arr. Điều này có nghĩa là tất cả 5000 giá trị trong hàng đầu tiên sẽ được chia chính xác, và hàng thứ hai cũng sẽ chính xác đến chỉ số 3192. Tiếp theo, các giá trị 1808 còn lại được đưa vào bộ đệm cho bộ phận tại chỗ nhưng hàng đầu tiên đã thay đổi: arr[0] giờ đây chỉ đơn giản là chế độ xem của một hàng, vì vậy các giá trị trong các cột sau sẽ chỉ được chia cho một hàng.

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