2013-06-05 34 views
18

Tôi có một numpy mảng như:NumPy mảng, thay đổi các giá trị mà không phải là trong một danh sách các chỉ số

a = np.arange(30) 

tôi biết rằng tôi có thể thay thế các giá trị tọa lạc tại vị trí indices=[2,3,4] sử dụng ví dụ lập chỉ mục ưa thích:

a[indices] = 999 

Nhưng cách thay thế các giá trị tại các vị trí không nằm trong indices? Sẽ là một cái gì đó như dưới đây?

a[ not in indices ] = 888 

Cảm ơn bạn!

Trả lời

22

Tôi không biết một cách sạch sẽ để làm một cái gì đó như thế này:

mask = np.ones(a.shape,dtype=bool) #np.ones_like(a,dtype=bool) 
mask[indices] = False 
a[~mask] = 999 
a[mask] = 888 

Tất nhiên, nếu bạn thích sử dụng các dữ liệu NumPy-type, bạn có thể sử dụng dtype=np.bool_ - Sẽ không có bất kỳ sự khác biệt nào trong đầu ra. nó chỉ là vấn đề sở thích thực sự.

+4

tại sao không sử dụng 'np.ones_like' – jamylak

+0

@jamylak - bởi vì tôi cần phải nhìn up tài liệu trên 'np.ones_like', nhưng tôi biết cách' np.ones' làm việc ;-) – mgilson

+4

Trên một lưu ý phụ, bạn có thể thay thế vài dòng cuối cùng của bạn bằng một cuộc gọi duy nhất tới 'numpy.where' (đây là trường hợp chính nơi nó thực sự hữu ích). Ví dụ. 'a = np.where (mặt nạ, 888, 999)'. –

3

Rõ ràng không có tổng đài not chung cho các bộ. Lựa chọn của bạn là:

  1. Trừ bộ indices của bạn từ một tập phổ biến của chỉ số (phụ thuộc vào hình dạng của a), nhưng điều đó sẽ là một chút khó khăn để thực hiện và đọc.
  2. Một số loại lặp lại (có lẽ là for-vòng lặp là đặt cược tốt nhất của bạn vì bạn chắc chắn muốn sử dụng thực tế là các chỉ mục của bạn được sắp xếp).
  3. Tạo mảng mới chứa đầy giá trị mới và sao chép có chọn lọc chỉ mục từ giá trị cũ.

    b = np.repeat(888, a.shape) 
    b[indices] = a[indices] 
    
4

Chỉ làm việc cho mảng 1d:

a = np.arange(30) 
indices = [2, 3, 4] 

ia = np.indices(a.shape) 

not_indices = np.setxor1d(ia, indices) 
a[not_indices] = 888 
2

Chỉ cần vượt qua tình huống tương tự, giải quyết theo cách này:

a = np.arange(30) 
indices=[2,3,4] 

a[indices] = 999 

not_in_indices = [x for x in range(len(a)) if x not in indices] 

a[not_in_indices] = 888 
Các vấn đề liên quan