Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
49 views
in Technique[技术] by (71.8m points)

python - Combining two numpy arrays with equations based on both arrays

I have a python numpy 3x4 array A:

A=np.array([[0,1,2,3],[4,5,6,7],[1,1,1,1]])

and a 3x3 array B:

B=np.array([[1,1, 1],[2, 2, 2],[3,3,3]])

I am trying to use a numpy operation to produce array C where each element in C is based on an equation using corresponding elements in A and the entire row in B. A simplified example:

C[row,col] = A[ro1,col] *  ( A[row,col] / B[row,0] + B[row,1] + B[row,2) )

My first thoughts were to just simple and just multiply all of A by column in B. Error.

C = A * B[:,0]

Then I thought to try this but it didn't work.

C = A[:,:]  * B[:,0]

I am not sure how to use the " : " operator and get access to the specific row, col at the same time. I can do this in regular loops but I wanted something more numpy.

mport numpy as np

A=np.array([[0,1,2,3],[4,5,6,7],[1,1,1,1]])
B=np.array([[1,1, 1],[2, 2, 2],[3,3,3]])
C=np.zeros([3,4])
row,col = A.shape
print(A.shape)
print(A)
print(B.shape)
print(B)
print(C.shape)
print(C)
print(range(row-1))
for row in range(row):
    for col in range(col):
        C[row,col] = A[row,col] * (( A[row,col] / B[row,0]) + B[row,1] + B[row,2])
        
print(C)

Which prints:

(3, 4)
[[0 1 2 3]
 [4 5 6 7]
 [1 1 1 1]]
(3, 3)
[[1 1 1]
 [2 2 2]
 [3 3 3]]
(3, 4)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
range(0, 2)
[[ 0.          3.          8.         15.        ]
 [24.         32.5        42.          0.        ]
 [ 6.33333333  6.33333333  0.          0.        ]]

Suggestions on a better way? Edited: Now that I understand broadcasting a bit more, and got that code running, let me expand in a generic way what I am trying to solve. I am trying to map values of a category such as "Air" which can be a range (such as 0-5) that have to be mapped to a shade of a given RGB value. The values are recorded over a time period. enter image description here

For example, at time 1, the value of Water is 4. The standard RGB color for Water is Blue (0,0,255). There are 5 possible values for Water. In the case of Blue, 255 / 5 = 51. To get the effect of the 4 value on the Blue palette, multiply 51 x 4 = 204. Since we want higher values to be darker, we subtract 255 (white) - 205 yielding 51. The Red and Green components end up being 0. So the value read at time N is a multiply on the weighted R, G and B values. We invert 0 values to be subtracted from 255 so they appear white. Stronger values are darker.

So to calculate the R' G' and B' for time 1 I used:

answer = data[:,1:4] - (data[:,1:4] / data[:,[0]] * data[:,[4]])

I can extract an [R, G, B] from and answer and put into an Image at some x,y. Works good. But I can't figure out how to use Range, R, G and B and calculate new R', G', B' for all Time 1, 2, ... N. Trying to expand the numpy approach if possible. I did it with standard loops as:

for row in range(rows):
    for col in range(cols):
        r = int(data[row,1] - (data[row,1] / data[row,0] * data[row,col_offset+col] ))
        g = int(data[row,2] - (data[row,2] / data[row,0] * data[row,col_offset+col] ))
        b = int(data[row,3] - (data[row,3] / data[row,0] * data[row,col_offset+col] ))
        almostImage[row,col] = [r,g,b]

I can display the image in matplotlib and save it to .png, etc. So I think next step is to try list comprehension over the time points 2D array, and then refer back to the range and RGB values. Will give it a try.

question from:https://stackoverflow.com/questions/65912890/combining-two-numpy-arrays-with-equations-based-on-both-arrays

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Try this:

A*(A / B[:,[0]] + B[:,1:].sum(1, keepdims=True))

Output:

array([[ 0.        ,  3.        ,  8.        , 15.        ],
       [24.        , 32.5       , 42.        , 52.5       ],
       [ 6.33333333,  6.33333333,  6.33333333,  6.33333333]])

Explanation:

  1. The first operation A/B[:,[0]] utilizes numpy broadcasting.
  2. Then B[:,1:].sum(1, keepdims=True) is just B[:,1] + B[:,2], and keepdims=True allows the dimension to stay the same. Print it to see details.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...