Is is possible each cell of a numpy array iteratively from a function?

29 views Asked by At

Was not sure how exactly to word the question but here is the problem:

I essentially have an empty array S that is of shape n * n. I also have an array of data R, of shape n * m. My goal is for S[i][j] = some func combining R[i] R[j].

This is the code I wrote to accomplish what I want:

for i in range(n):
    for j in range(n):
        S[i][j] = foo(R[i], R[j])

I'd like to know if there is an existing numpy function that can do something like this, so I do not have to write the for loops.

1

There are 1 answers

0
Bi Rico On

In numpy we generally write foo to to be "array aware" to avoid needing to loop over our inputs. For example, you could take this function crossAddF and write an array aware version crossAddArray:

def crossAdd(a, b):
    S = np.zeros([len(a), len(b)])
    for i in range(len(a)):
        for j in range(len(b)):
            S[i][j] = a[i] + b[j]
    return S

def corssAddArray(a, b):
    a = np.reshape(a, [len(a), 1])
    b = np.reshape(b, [1, len(b)])
    return a + b

That being said, I realize that we sometimes need to work with functions that weren't meant for numpy that we can't easily re-write or change. In that case numpy.vectorize can be useful. Keep in mind that vectorize can be slower than other implementations of the same functionality. Here's an example:

def foo(i, j):
    return float(i) + float(j)

def crossAddUsingVectorize(a, b):
    a = np.reshape(a, [len(a), 1])
    b = np.reshape(b, [1, len(b)])
    return np.vectorize(foo)(a, b)

My examples also use numpy's broadcasting feature it might be worth reading about if you're not already familiar with it.