1

我对 Python 非常陌生(过去我使用过 Mathematica、Maple 或 Matlab 脚本)。我对 NumPy 如何评估数组上的函数但在尝试在多个维度上实现它时遇到问题印象深刻。我的问题很简单(请不要笑):有没有更优雅和有效的方法来评估某些函数 f(在 R^2 上定义)而不使用循环?

import numpy    
M=numpy.zeros((10,10))
for i in range(0,10):
    for j in range(0,10):
        M[i,j]=f(i,j)
return M
4

4 回答 4

1

使用 numpy 编码时的目标是尽可能在整个数组上实现计算。因此,例如,如果您的函数是,f(x,y) = x**2 +2*y并且您想将其应用于 中的所有整数对x,y[0,10]x[0,10]请执行以下操作:

x,y = np.mgrid[0:10, 0:10]
fxy = x**2 + 2*y

如果您找不到以这种方式表达您的功能的方法,那么:

  1. 询问如何做(并明确说明函数定义)
  2. 使用 numpy.vectorize

使用相同的示例vectorize

def f(x,y): return x**2 + 2*y

x,y = np.mgrid[0:10, 0:10]
fxy = np.vectorize(f)(x.ravel(),y.ravel()).reshape(x.shape)

请注意,实际上我只在数组的内容不是数字时才使用vectorize类似于 python的方法。map一个典型的例子是计算列表数组中所有列表的长度:

# construct a sample list of lists 
list_of_lists = np.array([range(i) for i in range(1000)])
print np.vectorize(len)(list_of_lists)
# [0,1 ... 998,999]
于 2013-12-05T16:06:39.153 回答
0

不依赖于 numpy 工具的纯 python 答案是制作两个序列的笛卡尔积:

from itertools import product
for i, j in product(range(0, 10), range(0, 10)):
    M[i,j]=f(i,j)

编辑:实际上,我应该正确阅读这个问题。这仍然使用循环,只是少了一个循环。

于 2013-05-08T03:55:21.727 回答
0

是的,许多 numpy 函数在 N 维数组上运行。举个例子:

>>> M = numpy.zeros((3,3))
>>> M[0][0] = 1
>>> M[2][2] = 1
>>> M
array([[ 1.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  1.]])
>>> M > 0.5
array([[ True, False, False],
       [False, False, False],
       [False, False,  True]], dtype=bool)
>>> numpy.sum(M)
2.0

请注意 numpy.sum 和 sum 之间的区别,它在 N 维数组上运行,而 sum 只深 1 级:

>>> sum(M)
array([ 1.,  0.,  1.])

因此,如果您使用适用于 n 维数组的操作构建函数 f(),那么 f() 本身将适用于 n 维数组。

于 2013-05-08T03:44:32.030 回答
0

您还可以使用 numpy 多维切片,如下所示。您只需为每个维度提供切片:

arr = np.zeros((5,5)) # 5 rows, 5 columns

# update only first column
arr[:,0] = 1

# update only last row ... same as arr[-1] = 1
arr[-1,:] = 1

# update center
arr[1:-1, 1:-1] = 1

print arr

输出:

array([[ 1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  1.]])
于 2013-05-08T03:46:49.223 回答