首页 > 解决方案 > numpy数组的每个单元格是否可以从一个函数中迭代?

问题描述

不确定如何准确地表达这个问题,但问题是:

我基本上有一个形状为 n * n 的空数组 S。我还有一个数据 R 数组,形状为 n * m。我的目标是 S[i][j] = some func 结合 R[i] R[j]。

这是我写的代码来完成我想要的:

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

我想知道是否有一个现有的 numpy 函数可以做这样的事情,所以我不必编写 for 循环。

标签: pythonarraysnumpy

解决方案


在 numpy 中,我们通常写入foo“数组感知”以避免需要循环我们的输入。例如,您可以使用此函数crossAddF并编写一个数组感知版本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

话虽如此,我意识到我们有时需要使用不适用于 numpy 的函数,我们无法轻易地重写或更改。在这种情况下numpy.vectorize可能很有用。请记住,这vectorize可能比相同功能的其他实现要慢。这是一个例子:

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)

我的示例还使用了 numpy 的广播功能,如果您还不熟悉它,可能值得一读。


推荐阅读