2013-05-13 46 views
5

Tôi đã một mảng mà trông như thế này ví dụ:Python mảng NumPy thay thế

array([[ 1, 1, 2, 0, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 0, 0, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 0, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49]]) 

Tôi có mảng khác hai mà cũng giống như:

array([[ 0, 0, 0, 0], 
     [ 0, 0, 0, 0], 
     [ 0, 2891, 0, 0], 
     [ 0, 0, 0, 0], 
     [ 0, 0, 0, 2891]]) 

array([[ 0, 0, 0, 643], 
     [ 0, 0, 0, 0], 
     [ 0, 0, 643, 0], 
     [ 0, 0, 0, 0], 
     [ 0, 0, 0, 0]]) 

gì Tôi muốn là chọn giá trị 2891 từ mảng thứ 2 đến mảng đầu tiên ở vị trí tương ứng và cũng 643 từ mảng thứ ba tới linh sam st mảng ở vị trí tương ứng để các mảng cuối cùng sẽ trông như thế này:

array([[ 1, 1, 2, 643, 4], 
     [ 5, 6, 7, 8, 9], 
     [ 10, 2891, 643, 13, 14], 
     [ 15, 16, 17, 18, 19], 
     [ 20, 21, 22, 2891, 24], 
     [ 25, 26, 27, 28, 29], 
     [ 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39], 
     [ 40, 41, 42, 43, 44], 
     [ 45, 46, 47, 48, 49]]) 

Cho đến nay tôi đã cố gắng lệnh này:

np.place(a,a<1, np.amax(b)) 

nơi a đề cập đến mảng đầu tiên và b gọi đến Mảng thứ hai. Những gì nó làm nó chỉ thay thế tất cả các giá trị 0 với giá trị 2891. Ai đó có thể giúp đỡ?

Trả lời

5

Bạn có thể tìm thấy các chỉ số nơi yz là khác không sử dụng phương pháp khác không:

In [9]: y.nonzero() 
Out[9]: (array([2, 4]), array([1, 3])) 

In [10]: z.nonzero() 
Out[10]: (array([0, 2]), array([3, 2])) 

Bạn có thể chọn giá trị được liên kết throug h fancing indexing:

In [11]: y[y.nonzero()] 
Out[11]: array([2891, 2891]) 

và bạn có thể gán các giá trị đến các địa điểm trong x với

In [13]: x[y.nonzero()] = y[y.nonzero()] 

import numpy as np 
x = np.array([[ 1, 1, 2, 0, 4], 
       [ 5, 6, 7, 8, 9], 
       [10, 0, 0, 13, 14], 
       [15, 16, 17, 18, 19], 
       [20, 21, 22, 0, 24], 
       [25, 26, 27, 28, 29], 
       [30, 31, 32, 33, 34], 
       [35, 36, 37, 38, 39], 
       [40, 41, 42, 43, 44], 
       [45, 46, 47, 48, 49]]) 

y = np.array([[ 0, 0, 0, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 2891, 0, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 0, 2891]]) 

z = np.array([[ 0, 0, 0, 643], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 643, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 0, 0]]) 

x[y.nonzero()] = y[y.nonzero()] 
x[z.nonzero()] = z[z.nonzero()] 
print(x) 

sản lượng

[[ 1 1 2 643 4] 
[ 5 6 7 8 9] 
[ 10 2891 643 13 14] 
[ 15 16 17 18 19] 
[ 20 21 22 2891 24] 
[ 25 26 27 28 29] 
[ 30 31 32 33 34] 
[ 35 36 37 38 39] 
[ 40 41 42 43 44] 
[ 45 46 47 48 49]] 
3

Bạn có nghĩa là chọn giá trị tối đa từ mảng thứ hai và mảng thứ ba không? Nếu vậy, hãy thử sau:

Init dữ liệu:

In [48]: arr = array([[ 1, 1, 2, 0, 4], 
    ....: [ 5, 6, 7, 8, 9], 
    ....: [10, 0, 0, 13, 14], 
    ....: [15, 16, 17, 18, 19], 
    ....: [20, 21, 22, 0, 24], 
    ....: [25, 26, 27, 28, 29], 
    ....: [30, 31, 32, 33, 34], 
    ....: [35, 36, 37, 38, 39], 
    ....: [40, 41, 42, 43, 44], 
    ....: [45, 46, 47, 48, 49]]) 

In [49]: arr1 = array([[ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 2891, 0, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 2891]]) 

In [50]: arr2 = array([[ 0, 0, 0, 643], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 643, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 0]]) 

Chọn và Thay thế:

In [51]: arr[arr1==arr1.max()] = arr1.max() 

In [52]: arr[arr2==arr2.max()] = arr2.max() 

In [53]: arr 
Out[53]: 
array([[ 1, 1, 2, 643, 4], 
     [ 5, 6, 7, 8, 9], 
     [ 10, 2891, 643, 13, 14], 
     [ 15, 16, 17, 18, 19], 
     [ 20, 21, 22, 2891, 24], 
     [ 25, 26, 27, 28, 29], 
     [ 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39], 
     [ 40, 41, 42, 43, 44], 
     [ 45, 46, 47, 48, 49]]) 
+1

có thể nhanh hơn để lưu trữ 'arr1.max() '/' arr2.max' – jamylak

+0

thnax cho câu trả lời của bạn. Tôi hiểu lời giải thích của câu trả lời thứ hai đó là lý do tại sao tôi chấp nhận câu trả lời đó. Nhưng bạn cũng làm việc. – user2095624

+0

Hãy cẩn thận có một vài khác biệt giữa các câu trả lời của chúng tôi. Tôi chọn giá trị tối đa và thay thế chúng Trong khi chúng chọn những giá trị khác 0 và sau đó thay thế chúng. Nếu có hai loại số không khác trong mảng thứ hai hoặc thứ ba của bạn, đầu ra sẽ khác nhau. – waitingkuo

0

Trong NumPy bạn có thể subscript mảng trong lạ cách. 1. với một mảng boolean 2. với chỉ số

a1[a2 > 0] = a2[a2.nonzero()] 
Các vấn đề liên quan